上一篇中提到了回调地狱的问题,ES6为了解决多层回调,提高代码的可阅读性,提出了一套异步的通用模型,这一部分对理解promise很重要

1.两个阶段

该模型中,将一件可能发生异步操作的事情分为两个阶段:unsettledsettled

  • unsettled:未解决阶段,表示事情还在进行前期的处理,并没有发生通向结果的那件事
  • settled:已解决阶段,事情已经有了一个结果,不管这个结果是什么,整件事情无法逆转

【注】事情总是从为解决阶段逐步发展到以解决阶段的,并且未解决阶段拥有控制何时通向已解决阶段

举个例子来说明一下,某天小明去超市购物,选好商品以后,小明来到收银台,一边掏出手机准备支付,一边排队等待结账(异步),此时事件为未解决阶段,且等待的时间控制着事件何时进入已解决阶段。当小明之前的客人均结账后,轮到小明结账,此时会出现几种结果:1)小明的余额充足,成功结账,小明美滋滋;2)小明的余额不足,尴了个尬,小明表示我原本很快乐,是没钱害了我;3)收银台的机器出现问题,小明不能买单(此时系统报错,相当于将事件推向了rejected,后面详细讲)。接下来康康小明shopping的代码吧

//小明去购物
function goShopping() {console.log('小明挑选商品');console.log('小明等待结账');setTimeout(() => {console.log('小明开始结账');if (Math.random()>0.5) { //表示小明的余额足够结账console.log('小明的余额充足,成功结账,小明表示美滋滋');} else {console.log('小明的余额不足,尴了个尬,小明表示我原本很快乐,是没钱害了我');}}, 1000);
}
goShopping();

2.三种状态

ES6将事情划分为三种状态,pendingresolvedrejected

  • pending:挂起,处于未解决阶段,表示这件事情的最终结果还没有出来
  • resolved:已处理,以解决阶段的一种状态,表示整件事情已经出现结果,并且是一个可以按照正常逻辑进行下去的结果
  • rejected:已拒绝,已解决阶段的一种状态,表示整件事情已经出现了结果,并且是一个无法按照正常逻辑进行下去的结果,通常用于表示有一个错误

【注】

1)未解决阶段可以决定事情最终的状态;

2)我们把事情变为resolved状态的过程叫做resolve,推向该状态时可能会传递一些数据;

3)我们把事情变为rejected状态的过程叫做reject,推向该状态时可能会传递一些数据,通常为错误信息;

这里我们再来参照小明购物的例子,从小明开始购物开始,这件事情是一个未解决阶段,是一个挂起过程,并且随着小明挑选商品购物等等,开始逐步发展向已解决阶段。当轮到小明买单时,会出现三种情况:余额充足成功支付,余额不足无法支付,系统报错未建立连接。根据三种情况我们分析,前两种属于按照正常逻辑处理,即resolved状态,而第三种属于未按照正常逻辑处理,系统拒绝给小明结账,即rejected状态。这里需要注意的点是,由于余额不足导致的未成功支付不属于rejected,因为该情况是按照正常的逻辑执行完的。

【注】无论是阶段还是状态,都是不可逆的

3.后续处理

当事情达到已解决阶段后,通常需要进行后续处理,不同的以解决状态决定了不同的后续处理

  • resolved状态:这是一个正常的以解决状态,后续处理表示为thenable
  • rejected状态:这是一个非正常的以解决状态,后续处理表示为catchable

【注】后续处理可能有多个,因此形成作业队列,这些后续处理会按照顺序,当状态到达后依次执行

学习Promise之前你必须理解的知识点:异步处理的通用模型相关推荐

  1. 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 0.1图计算基本概念 首先看到百度百科定义: 图计算(Graph Processin ...

  2. 数据治理专业认证CDMP学习笔记(思维导数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第11章数据仓库和商务智能篇...

    大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识. 数据治理 ...

  3. 数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第八章数据集成和互操作篇...

    大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识. 数据治理 ...

  4. A.关于图计算图学习的基础知识概览:前置知识点学习(Paddle Graph L)【一】

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

  5. 结合商业项目深入理解Go知识点

    这篇文章比较硬核,爆肝5千字,把之前整理的知识点都串起来了.建议先收藏,慢慢看. 前言 上一篇文章 #[Go WEB进阶实战]开源的电商前后台API系统 很受大家欢迎,有好多小伙伴私信我问题:&quo ...

  6. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  7. Promise async/await的理解和用法

    Promise && async/await的理解和用法 为什么需要promise(承诺)这个东西 在之前我们处理异步函数都是用回调这个方法,回调嵌套的时候会发现 阅读性 和 调试 的 ...

  8. F#学习之路(2) 深刻理解函数(上)

    函数在函数式编程语言中是一等公民,是函数式语言中最重要的基本组成元素,也是其名称的由来. F# 中的函数之如C#中的类,是组织程序结构的最基本单元.是命令式编程语言中函数或OO编程语言中方法的超集.超 ...

  9. 深度学习技术在机器阅读理解应用的研究进展

    深度学习解决机器阅读理解任务的研究进展:https://blog.csdn.net/malefactor/article/details/52832134 深度学习技术在机器阅读理解应用的研究进展:h ...

最新文章

  1. 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作
  2. mysql用户权限管理和增删改查操作
  3. CTFshow php特性 web89
  4. 鸟哥的Linux私房菜(基础篇)-第零章、计算机概论(零.2)
  5. Android开源之行之走进zxing,轻松实现二维码扫描(二)
  6. keil5用jlink不到芯片_洛达芯片检测
  7. 为什么技术团队领导者多是后台开发人员
  8. Spark中导入scalax
  9. 微服务架构下,DLI的部署和运维有何奥秘?
  10. iOS CoreData (一) 增删改查
  11. c语言指针慕课,C语言-指针
  12. 用python计算2+4+6+…+20的值_Day4-Python-循环和分之学习-2018/7/19
  13. 《Core Data应用开发实践指南》一2.15 小结
  14. .net中的各种委托(Delegate、Action、Func)
  15. Python 正则表达模块详解
  16. Latex公式中符号上下分别加横线的写法
  17. eclipse常用快捷方式
  18. 腾讯优图实现人脸对比
  19. RabbitMQ的Routing 路由模式(Direct)
  20. Concepts:Overview

热门文章

  1. PyCairo 中的剪裁和屏蔽
  2. 云网络丢包故障定位全景指南
  3. Amazon上最畅销的「操作系统书」有哪些?
  4. Kafka监控架构设计
  5. Java集合框架:LinkedList
  6. Facebook如何将QUIC应用于数十亿流量传输
  7. 腾讯成功入选LoRa联盟新一届董事会
  8. Tencent Blade team荣获小米安全年度最佳守护者
  9. Pico Pro Maker Kit NXP i.MX7D刷入Android Things
  10. CIFAR-10数据集可视化二进制版本