-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
var time = '2016/06/13';承接Promises/A:
一个promise对象代表了一个异步操作的最终结果,对其操作的最主要方式是通过then方法。在then 方法中分别注册有回调函数来处理promise的最终结果或是不能获得结果的原因(执行失败)。
Promise/A+具体阐明了早期Promise/A提及的一些表现条目,作为扩展覆盖了实际意义上的行为,丢弃了部分不足和有问题的部分。
最后,目前的核心Promise/A+声明不会处理关于如何create,fulfill, reject promise,取而代之的是专注于提供一个可以相互协作的then方法。规范未来的声明中可能会对这些主题有所阐述。
1,Terminology(术语)
1.1”promise”:一个带有一个符合本文规范的then方法的对象或是函数
1.2“thenable”: 一个定义then方法的对象或是方法。
1.3“value”:任何合法的js值(包含undefined, a thenable, or a promise )
1.4”exception”:是一个用throw抛出的值
1.5“reason”:是一个值,其指示了一个promise为什么被reject
2,Requirements(要求)
2.1.Promise States (状态)
一个promise对象必须处于一下三种状态之一:pending,fulfilled,rejected。
2.1.1.当处于pending状态,a promise:
2.1.1.1.可能会过度到fulfilled或是rejected状态。
2.1.2.当处于fulfilled状态,a promise:
2.1.2.1. 一定不能转到其他状态
2.1.2.2.一定拥有一个value,这个value must not change
2.1.3.当处于rejected状态,a promise:
2.1.3.1.一定不能转到其他状态
2.1.3.2.一定拥有一个reason,这个reason must not change
这里所说的‘must not change’意思是不可改变的身份(i.e. ===),但不是暗示深度不变性。
2.2.The then Method
一个promise对象必须提供一个then方法来获取该promise对象当前或是最终的结果(fulfilled)或是原因(rejected)
一个promise的then 方法接受两个参数:
promise.then(onFulfilled, onRejected)
2.2.1.onFulfilled和onRejected两个参数都是可选的:
2.2.1.1.如果onfulfilled参数不是一个函数,则会被忽略。
2.2.1.2.如果onRejected参数不是一个函数,则会被忽略。
2.2.2.如果onFulfilled是一个函数:
2.2.2.1.在Promise对象处于fulfilled状态时调用,promise的value结果作为其第一个参数
2.2.2.2.在promise对象处于fulfilled状态之前不会调用
2.2.2.3.调用次数只有一次
2.2.3.如果onFulfilled是一个函数:
2.2.3.1.在Promise对象处于rejected状态时调用,promise的reason原因作为其第一个参数
2.2.3.2.在promise对象处于rejected状态之前不会调用
2.2.3.3.调用次数只有一次
2.2.4. onFulfilled或是onRejected必须在执行上下文的堆中只包含平台代码(platform code)之后才能执行[3.1]
2.2.5.onFulfilled和onRejected必须作为函数被调用(i.e.with no this value)[3.2]
2.2.6.then方法在一个promise对象上可能会被调用多次
2.2.6.1.如果promise对象处于fulfilled状态,在它上面的then方法会按照调用顺序执行onFulfilled处理函数。
2.2.6.2.如果promise对象处于rejected状态,在它上面的then方法会按照调用顺序执行onRejected处理函数。
2.2.7.then方法必须返回一个promise对象[3.3]:
promise2 = promise1.then(onFulfilled, onRejected);
2.2.7.1.如果onFulfilled或onRejected返回一个未知的X值,这个时候会触发执行promise的解决程序:[[Resolve]](promise2, x)。
2.2.7.2.如果onFulfilled或onRejected抛出一个异常e,这时promise2必须以e为reason的形式处于rejected状态。
2.2.7.3.如果onFulfilled在promise1处于fulfilled状态时不是函数,promise2必须以promise1返回的value为结果处于fulfilled状态,执行相应的onFulfilled处理函数。
2.2.7.4.如果onRejected在promise1处于rejected状态时不是函数,promise2必须以promise1返回的reason为原因处于rejected状态,执行相应的onRejected处理函数。
2.3.Promise处理流程
Promise处理流程是一个抽象操作,表现为输入一个promise对象和一个value值,我们表示为[[Resolve]](promise, x)。如果x是一个thenable,处理流程会尝试着让promise在假设x会表现的像一个promise对象的前提下接受x的状态,否则,处理流程会用x做为value 使promise对象处于fulfill状态。
这里的thenable允许promise对象以相互操作的方式实现,只要它能产出一个符合Promises/A+规范的then方法.它也允许Promises/A+的实现过程中利用合理的then方法来处理好不规范的实现情况。
对于[[Resolve]](promise, x)的处理,会遵从下面的步骤:
2.3.1.如果Promise和x指向同一个对象,返回一个TepeError作为reason 来使promise处于reject状态。
2.3.2.如果x是一个Promise对象,接受x的状态:[3.4]
2.3.2.1.如果x处于pending状态,promise必须保持pending状态直到x的状态变为fulfilled或是rejected。
2.3.2.2.如果x处于fulfilled状态,则用x的value作为值来执行promise的fulfill状态。
2.3.2.3.如果x处于rejected状态,则用x的reason作为原因来执行promise的reject状态。
2.3.3.另外,如果x是一个对象或是函数,
2.3.3.1.让then作为x.then.[3.5]
2.3.3.2.如果取回的x.then的结果是被shown抛出的异常e,则promise将e作为reject的reason进行处理。
2.3.3.3.如果then是一个函数,利用x作为this堆对其进行调用,第一个参数resolvePromise,第二个参数rejectPromise,对于这些有如下规定:
2.3.3.3.1.如果resolvePromise被一个结果值y调用,则执行[[Resolve]](Promise, y)。
2.3.3.3.2.如果rejectPromise被一个reason r调用,则利用r对promise进行reject处理。
2.3.3.3.3.如果resolvePromise和rejectPromise都被调用,或是对相同的参数方法调用了多次,这种情况下,第一次调用优先,其他的调用都被忽略。
2.3.3.3.4.如果调用then抛出一个异常e,
2.3.3.3.4.1.如果resolvePromise或是rejectPromise已经被调用,忽略这个异常。
2.3.3.3.4.2.除此之外,即将e作为reason触发promise的reject状态。
2.3.3.4.如果then不是一个函数,则利用x作为结果值触发promise的fulfill状态。
2.3.4.如果x既不是一个对象,也不是一个函数,则利用x作为结果值触发promise的fulfill状态。
如果一个promise对象用一个加入了环状thenable链的tenable的结果来触发resolve状态,以致[[Resolve]](promise, tenable)的自然循环执行最后导致了[[Resolve]](promise, tenable)的再次执行,遵循以上算法规则将导致无限循环。这里我们鼓励实践,但也不强求你能够监测到这类似的递归循环,并用一个TypeError作为reason来触发promise的reject状态。
3,Notes(备注)
3.1.这里的’platform code’指的是引擎,环境,和promise的执行代码。在执行过程中,这个要求能保证在事件循环执行到then方法被调用时,onFulfilled和onRejected在新的堆中能够异步执行。这个能用宏指令任务(macro-task)像setTimeout或setImmediate,还可以用微指令任务(micro-task)像MutationObserver或是process.nextTick实现.
既然promise的实现会考虑到platform code,他自己也可以包含一个调用handler的任务队列。
3.2.这里说的是,在严格模式下,this在其中会被指向undefined,在松散模式下,他会被指向全局函数。
3.3.满足全部规范的promise实现可能会允许promise2===promise1,每一个promise的实现都应该指明它是否能让promise2===promise1,并且对适应场景进行详细说明。
3.4.总的来说,这里只知道如果x来自当前的实现,那x是一个true promise对象。这项指明了规范的具体操作的说明的意思是能接受已知的合理promise对象。
3.5.This procedure of first storing a reference to x.then, then testing that reference, and then calling that reference, avoids multiple accesses to the x.then property. Such precautions are important for ensuring consistency in the face of an accessor property, whose value could change between retrievals.
3.6.Implementations should not set arbitrary limits on the depth of thenable chains, and assume that beyond that arbitrary limit the recursion will be infinite. Only true cycles should lead to a TypeError; if an infinite chain of distinct thenables is encountered, recursing forever is the correct behavior.
等自己实现一套之后再来翻最后两段,前面也有挺多地方感觉没翻译到位,自娱,有误请指正。
Reactions are currently unavailable