Promises/A+规范

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; 如果遇到无限多个不同的罐头,则永远递归是正确的行为。

原文地址

你可能感兴趣的:(promise,javascript,前端,规范化)