Promises/A+标准
一个凋谢的规范,实现者为开发者提供的可操作JavaScript promise。
promise代表着异步操作最终后果。和promise交互的次要形式是通过其then办法,then办法通过注册回调以承受promise的最终值或者promise无奈实现的起因。
该标准详细描述了then办法的行为,提供了一个可互操作的根底,所有Promises/A+统一的promise实现都能够依赖于它来提供。因而,标准应该被认为是十分稳固的。只管Promises/A+组织偶然会对本标准进行一些小的向后兼容更改,以解决新发现的小问题,但只有通过认真思考、探讨和测试后,咱们才会集成较大或向后不兼容的更改。
从历史上看,Promises/A+说明了晚期Promise/A提案的行为条款,将其扩大到涵盖事实上的行为,并省略了未指定或有问题的局部。
最初,外围Promises/A+标准不波及如何创立、实现或回绝promise,而是抉择集中于提供可互操作的then办法。将来在配套标准中的工作可能会波及到这些主题。

1.术语

  1. “promise”是then行为合乎本标准的对象或函数。
  2. “ thenable”是定义then办法的对象或函数。
  3. “值”是任何非法的JavaScript值(包含undefined,ableable或promise)。
  4. “ exception”是应用该throw语句引发的值。
  5. “起因”是一个值,该值批示为什么回绝promise。

2.要求

2.1 promise状态

promise必须处于以下三种状态之一:待定,已实现或被回绝。

  1. 待定时,promise:可能会转换为已实现或已回绝状态。
  2. 当实现时,promise:

    1. 不得过渡到其余任何状态。
    2. 必须具备一个值,该值不能更改。
  3. 当被回绝时,promise:

    1. 不得过渡到其余任何状态。
    2. 必须有一个理由,不能扭转。
  4. 在此,“不得更改”是指不变的身份(即===),但并不示意深层的不变性。

2.2 then办法

promise必须提供一种then拜访其以后或最终价值或起因的办法。
允诺的then办法承受两个参数:

        promise.then(onFulfilled, onRejected)
  1. 这两个onFulfilled和onRejected可选的参数:

    1. 如果onFulfilled不是函数,则必须将其疏忽。
    2. 如果onRejected不是函数,则必须将其疏忽。
  2. 如果onFulfilled是一个函数:

    1. 必须在promise实现后调用,以promise的值作为第一个参数。
    2. 在promise实现之前肯定不能调用它。
    3. 不能屡次调用它。
  3. 如果onRejected是一个性能,

    1. 必须在promise被回绝之后以promise的理由作为第一个参数调用它。
    2. 在promise被回绝之前不能调用它。
    3. 不能屡次调用它。
  4. onFulfilled或onRejected在执行上下文堆栈仅蕴含平台代码之前不得调用。[ 3.1 ]。
  5. onFulfilled并且onRejected必须作为函数调用(即没有this值)。[ 3.2 ]
  6. then 可能在同一诺言中屡次被调用。

    1. 如果/何时promise实现,则所有各自的onFulfilled回调必须依照其对的原始调用的程序执行then。
    2. 如果/何时promise被回绝,则所有各自的onRejected回调必须依照其对的原始调用的程序执行then。
  7. then必须返回一个promise[ 3.3 ]。

    1. 如果有一个onFulfilled或onRejected返回一个值x,请运行Promise Resolution Procedure [[Resolve]](promise2, x)。
    2. 如果任何一个onFulfilled或onRejected引发异样e,则promise2必须e以其为理由予以回绝。
    3. 如果onFulfilled不是函数且promise1已实现,则promise2必须应用与雷同的值来实现promise1。
    4. 如果onRejected不是性能而promise1被回绝,则promise2必须以与雷同的理由将其回绝promise1。
       promise2 = promise1.then(onFulfilled, onRejected);

2.3promise解决程序

promise解决过程是一个形象的操作作为输出一个promise和一个值,它示意咱们作为[[Resolve]](promise, x)。如果x是可能的,则在行为至多相似于诺言的假如下,尝试promise采纳的状态。否则,它将满足value 。xxpromisex
只有对约定的实现公开Promises / A +兼容的then办法,对约定的实现就能够实现互操作。它还容许Promises / A +实现以正当的then办法“异化”不合格的实现。
要运行[[Resolve]](promise, x),请执行以下步骤:

  1. 如果promise和x援用雷同的对象,promise则以回绝TypeError为理由。
  2. 如果x是一个promise,则采纳其状态[ 3.4 ]:

    1. 如果x未决,则promise必须放弃未决状态,直到x实现或被回绝。
    2. 如果/何时x满足,promise则以雷同的值满足。
    3. 如果/何时x被回绝,promise则以雷同的理由回绝。
  3. 否则,如果x是对象或函数,

    1. then是x.then。[ 3.5 ]
    2. 如果检索属性x.then中抛出的异样的后果e,回绝promise与e作为的起因。
    3. 如果then是函数,请应用xas this,第一个参数resolvePromise和第二个参数进行调用rejectPromise,其中:

      1. 如果/何时resolvePromise应用值调用y,请运行[[Resolve]](promise, y)。
      2. 如果/当rejectPromise是带一个理由r,回绝promise与r。
      3. 如果同时调用resolvePromise和rejectPromise,或者对同一参数进行了屡次调用,则第一个调用优先,而所有其余调用均被疏忽。
      4. 如果调用then引发异样e,

        1. 如果resolvePromise或rejectPromise曾经被调用,则疏忽它。
        2. 否则,回绝promise与e作为的起因。
    4. 如果then不是一个函数,实现promise用x。
  4. 如果x不是一个对象或性能,实现promise与x。

如果应用参加循环的可循环链的可扩大物解决了诺言,使得[[Resolve]](promise, thenable)最终的递归性质最终导致[[Resolve]](promise, thenable)再次被调用,则遵循上述算法将导致有限递归。激励但不是必须的实现,以检测这种递归并promise以提供信息TypeError的理由回绝。[ 3.6 ]

3.笔记

  1. 这里的“平台代码”是指引擎,环境和promise实现代码。实际上,此要求可确保在调用事件循环之后并应用新堆栈onFulfilled并onRejected异步执行then。这能够通过“宏工作”机制(例如setTimeout或setImmediate)或“微工作”机制(例如MutationObserver或)来实现process.nextTick。因为promise实现被视为平台代码,因而它自身可能蕴含一个任务调度队列或“蹦床”,在其中调用处理程序。
  2. 也就是说,在严格模式下this将呈现undefined在其中;在懒惰(sloppy)模式下,它将是全局对象。
  3. promise2 === promise1如果实现满足有要求,则实现能够容许。每个实现都应记录其是否能够生产promise2=== promise1以及在什么条件下生产。
  4. 通常,只有x它来自以后的实现,才晓得这是一个真正的promise。本节容许应用特定于实现的形式来采纳已知合乎promise的状态。
  5. 首先存储对的援用x.then,而后测试该援用,而后调用该援用的过程防止了对该x.then属性的屡次拜访。此类预防措施对于确保访问者属性的一致性十分重要,因为访问者属性的值在两次检索之间可能会发生变化。
  6. 实现应不设置thenable链的深度任何限度,并假如超出任何限度递归将是有限的。只有真正的周期能力导致TypeError; 如果遇到有限多个不同的罐头,则永远递归是正确的行为。

原文地址