异步处理-异步处理的通用模型

699 阅读3分钟

理解一些基本概念

  1. 举例说明异步: 袁老师同时约了两位同学进行面试

    同步: 袁老师面试A同学的时候,B同学等着,面试完A同学,再面试B同学

    异步: 袁老师面试A同学的时候,先让A同学进行笔试,同时袁老师去面试B同学

    归纳:

    同步: 一个时间只能做一件事

    异步: 一个时间可以同时做多件事

  2. 模型 可以理解为一套规则,碰到什么情况按照这套规则解决.

ES官方参考了大量的异步场景,总结出了一套异步的通用模型,该模型可以覆盖几乎所有的异步场景,甚至是同步场景。

值得注意的是,为了兼容旧系统,ES6并不打算抛弃掉过去的做法,只是基于该模型推出一个全新的 API ,使用该API,会让异步处理更加的简洁优雅。

理解该API,最重要的,是理解它的异步模型。

  1. ES6将某一件可能发生异步操作的事情,分为两个阶段:unsettled和settled

    • unsettled:未决阶段,表示事情还在进行前期的处理,并没有发生通向结果的那件事。

    • settled:已决阶段,事情已经有了这个结果,不管这个结果是好是坏,整件事情无法逆转。

      举例说明:

      1. 比如:垦哥向女神发送表白短信。

        unsettled: 发送短信

        settled:女神给了回应

      2. 比如:发送ajax请求

        unsettled:还未从服务器收到结果

        settled:服务器已返回结果

      3. 比如:click点击事件

        unsettled:浏览器监听窗口中的某个元素,是否被点击

        settled:按钮已经被点击了

      事情总是从 未决阶段 逐步发展到 已决阶段 的。并且,未决阶段拥有控制何时通向已决阶段的能力。

      举例说明: ajax请求里,这句话通向已决。

  2. ES6将这两个阶段化分为三种状态:pending(挂起)、resolved(已解决)、rejected(已拒绝)

    • pending:挂起,处于未决阶段,则表示这件事情还在挂起(最终的结果还没出来)

    • resolved:已处理,已决阶段的一种状态,表示整件事情已经出现结果,并是一个可以按照正常逻辑进行下去的结果。

      1. 比如:垦哥向女神发送表白短信。

        unsettled:发送短信

        resolved:女神给了回应(不管答应还是拒绝)

    • rejected:已拒绝,已决阶段的一种状态,表示整件事情已经出现结果,并是一个无法按照正常逻辑进行下去的结果,通常用于表示有一个错误。

      1. 比如:垦哥向女神发送表白短信。

        unsettled:发送短信

        rejected:因为网络原因没有发送成功或者发给了他的好兄弟董哥

      2. 比如:发送ajax请求

        unsettled:向服务器发送ajax请求

        rejected:服务器网络不好连不上

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

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

    始终记住,无论是unsettled和settled阶段,还是pending(挂起)、resolved(已解决)、rejected(已拒绝)状态,都是不可逆的!

  3. 当事情达到已决阶段后,通常需要进行后续处理,不同的已决阶段,决定了不同的后续处理。

    比如:ajax请求,后续处理就是调用的success回调。

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

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

  4. 整件事称之为Promise

理解上面的概念,对学习Promise至关重要!