理解一些基本概念
-
举例说明异步: 袁老师同时约了两位同学进行面试
同步: 袁老师面试A同学的时候,B同学等着,面试完A同学,再面试B同学
异步: 袁老师面试A同学的时候,先让A同学进行笔试,同时袁老师去面试B同学
归纳:
同步: 一个时间只能做一件事
异步: 一个时间可以同时做多件事
-
模型 可以理解为一套规则,碰到什么情况按照这套规则解决.
ES官方参考了大量的异步场景,总结出了一套异步的通用模型,该模型可以覆盖几乎所有的异步场景,甚至是同步场景。
值得注意的是,为了兼容旧系统,ES6并不打算抛弃掉过去的做法,只是基于该模型推出一个全新的 API ,使用该API,会让异步处理更加的简洁优雅。
理解该API,最重要的,是理解它的异步模型。
-
ES6将某一件可能发生异步操作的事情,分为两个阶段:unsettled和settled
-
unsettled:未决阶段,表示事情还在进行前期的处理,并没有发生通向结果的那件事。
-
settled:已决阶段,事情已经有了这个结果,不管这个结果是好是坏,整件事情无法逆转。
举例说明:
-
比如:垦哥向女神发送表白短信。
unsettled: 发送短信
settled:女神给了回应
-
比如:发送ajax请求
unsettled:还未从服务器收到结果
settled:服务器已返回结果
-
比如:click点击事件
unsettled:浏览器监听窗口中的某个元素,是否被点击
settled:按钮已经被点击了
事情总是从 未决阶段 逐步发展到 已决阶段 的。并且,未决阶段拥有控制何时通向已决阶段的能力。
举例说明: ajax请求里,这句话通向已决。
-
-
-
ES6将这两个阶段化分为三种状态:pending(挂起)、resolved(已解决)、rejected(已拒绝)
-
pending:挂起,处于未决阶段,则表示这件事情还在挂起(最终的结果还没出来)
-
resolved:已处理,已决阶段的一种状态,表示整件事情已经出现结果,并是一个可以按照正常逻辑进行下去的结果。
-
比如:垦哥向女神发送表白短信。
unsettled:发送短信
resolved:女神给了回应(不管答应还是拒绝)
-
-
rejected:已拒绝,已决阶段的一种状态,表示整件事情已经出现结果,并是一个无法按照正常逻辑进行下去的结果,通常用于表示有一个错误。
-
比如:垦哥向女神发送表白短信。
unsettled:发送短信
rejected:因为网络原因没有发送成功或者发给了他的好兄弟董哥
-
比如:发送ajax请求
unsettled:向服务器发送ajax请求
rejected:服务器网络不好连不上
-
我们将 把事情变为resolved状态 的过程叫做 resolve,推向该状态时,可能会传递一些数据
我们将 把事情变为rejected状态 的过程叫做 reject,推向该状态时,可能会传递一些数据,通常为错误信息
始终记住,无论是unsettled和settled阶段,还是pending(挂起)、resolved(已解决)、rejected(已拒绝)状态,都是不可逆的!
-
-
当事情达到已决阶段后,通常需要进行后续处理,不同的已决阶段,决定了不同的后续处理。
比如:ajax请求,后续处理就是调用的success回调。
- resolved状态:这是一个正常的已决状态,后续处理表示为thenable
- rejected状态:这是一个非正常的已决状态,后续处理表示为catchable
后续处理可能有多个,因此会形成作业队列,这些后续处理会按照顺序,当状态到达后依次执行。
-
整件事称之为Promise
理解上面的概念,对学习Promise至关重要!