写在前面:
JS 经常会遇到 异步任务, 所谓异步任务,就是需要经过一段时间 或 当某个时机达到后才能得到结果的任务
比如:
- 使用ajax 请求服务器,当服务器完成响应后拿到响应结果
- 监听按钮是否被点击,当按钮被点击后拿到某个文本框的值
- 使用 setTimeout() ,等待一段时间后做某一件事
JS 没有一种标准的模式来处理这种场景,就导致不同的人书写的异步代码方式不一样。
ES 6 总结了各种异步场景,并提出一种通用的异步模型
ES6 的异步处理模型
es6 将异步场景分为两个阶段和三种状态:
两个阶段: unsettled(未决) 和 settles (已决)
三种状态: pending(挂起)、 resolved(完成)、 rejected(失败)
看下它们的关系图:
当任务处于未决阶段时,它一定时 pending 状态,表示任务从开始 到 拿到结果之间的过程。比如:网络完成了各种配置,也发送了请求,但是请求结果还没有拿到。
当任务处于已决阶段时,它只能是 resolved 和 rejected 两种状态中的一种,表示任务有了一个结果。比如:从服务器拿到了数据(resolved),网络不好没有拿到数据(rejected)
任务开始时,始终是未决阶段,那任务如何才能走向已决阶段呢?
ES6 认为任务在未决阶段的时候,有能力将其推向已决。比如:当从服务器拿到数据后,就从未决阶段推向已决的 resolved 状态;如果网络不好,导致出错了,就从未决阶段推向已决的 rejected 状态。
我们把