学习Promise之前你必须理解的知识点:异步处理的通用模型
上一篇中提到了回调地狱的问题,ES6为了解决多层回调,提高代码的可阅读性,提出了一套异步的通用模型,这一部分对理解promise很重要
1.两个阶段
该模型中,将一件可能发生异步操作的事情分为两个阶段:unsettled 和 settled
- 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将事情划分为三种状态,pending,resolved,rejected
- pending:挂起,处于未解决阶段,表示这件事情的最终结果还没有出来
- resolved:已处理,以解决阶段的一种状态,表示整件事情已经出现结果,并且是一个可以按照正常逻辑进行下去的结果
- rejected:已拒绝,已解决阶段的一种状态,表示整件事情已经出现了结果,并且是一个无法按照正常逻辑进行下去的结果,通常用于表示有一个错误
【注】
1)未解决阶段可以决定事情最终的状态;
2)我们把事情变为resolved状态的过程叫做resolve,推向该状态时可能会传递一些数据;
3)我们把事情变为rejected状态的过程叫做reject,推向该状态时可能会传递一些数据,通常为错误信息;
这里我们再来参照小明购物的例子,从小明开始购物开始,这件事情是一个未解决阶段,是一个挂起过程,并且随着小明挑选商品购物等等,开始逐步发展向已解决阶段。当轮到小明买单时,会出现三种情况:余额充足成功支付,余额不足无法支付,系统报错未建立连接。根据三种情况我们分析,前两种属于按照正常逻辑处理,即resolved状态,而第三种属于未按照正常逻辑处理,系统拒绝给小明结账,即rejected状态。这里需要注意的点是,由于余额不足导致的未成功支付不属于rejected,因为该情况是按照正常的逻辑执行完的。
【注】无论是阶段还是状态,都是不可逆的
3.后续处理
当事情达到已解决阶段后,通常需要进行后续处理,不同的以解决状态决定了不同的后续处理
- resolved状态:这是一个正常的以解决状态,后续处理表示为thenable
- rejected状态:这是一个非正常的以解决状态,后续处理表示为catchable
【注】后续处理可能有多个,因此形成作业队列,这些后续处理会按照顺序,当状态到达后依次执行
学习Promise之前你必须理解的知识点:异步处理的通用模型相关推荐
- 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]
关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 0.1图计算基本概念 首先看到百度百科定义: 图计算(Graph Processin ...
- 数据治理专业认证CDMP学习笔记(思维导数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第11章数据仓库和商务智能篇...
大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识. 数据治理 ...
- 数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第八章数据集成和互操作篇...
大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识. 数据治理 ...
- A.关于图计算图学习的基础知识概览:前置知识点学习(Paddle Graph L)【一】
图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...
- 结合商业项目深入理解Go知识点
这篇文章比较硬核,爆肝5千字,把之前整理的知识点都串起来了.建议先收藏,慢慢看. 前言 上一篇文章 #[Go WEB进阶实战]开源的电商前后台API系统 很受大家欢迎,有好多小伙伴私信我问题:&quo ...
- 大白话讲解Promise(二)理解Promise规范
上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...
- Promise async/await的理解和用法
Promise && async/await的理解和用法 为什么需要promise(承诺)这个东西 在之前我们处理异步函数都是用回调这个方法,回调嵌套的时候会发现 阅读性 和 调试 的 ...
- F#学习之路(2) 深刻理解函数(上)
函数在函数式编程语言中是一等公民,是函数式语言中最重要的基本组成元素,也是其名称的由来. F# 中的函数之如C#中的类,是组织程序结构的最基本单元.是命令式编程语言中函数或OO编程语言中方法的超集.超 ...
- 深度学习技术在机器阅读理解应用的研究进展
深度学习解决机器阅读理解任务的研究进展:https://blog.csdn.net/malefactor/article/details/52832134 深度学习技术在机器阅读理解应用的研究进展:h ...
最新文章
- 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作
- mysql用户权限管理和增删改查操作
- CTFshow php特性 web89
- 鸟哥的Linux私房菜(基础篇)-第零章、计算机概论(零.2)
- Android开源之行之走进zxing,轻松实现二维码扫描(二)
- keil5用jlink不到芯片_洛达芯片检测
- 为什么技术团队领导者多是后台开发人员
- Spark中导入scalax
- 微服务架构下,DLI的部署和运维有何奥秘?
- iOS CoreData (一) 增删改查
- c语言指针慕课,C语言-指针
- 用python计算2+4+6+…+20的值_Day4-Python-循环和分之学习-2018/7/19
- 《Core Data应用开发实践指南》一2.15 小结
- .net中的各种委托(Delegate、Action、Func)
- Python 正则表达模块详解
- Latex公式中符号上下分别加横线的写法
- eclipse常用快捷方式
- 腾讯优图实现人脸对比
- RabbitMQ的Routing 路由模式(Direct)
- Concepts:Overview