本文主要是对PromiseA+规范的翻译加上个人理解。1什么是PromisePromise表示异步操作的最终结果表示异步操作的最终结果。这个时候可以看看使用promises来了解背景。2Termpromise:包含一个名为then方法的对象或函数,then方法的行为符合promisesA+标准thenable:包含一个名为then方法的对象或函数value:合法的JavaScript值(包括undefined)exception:通过throwstatementThrowingvaluereason:表示promise被拒绝。它本质上是一种价值。promise对象必须是thenable对象,但是thenable对象不一定是promise对象。3要求3.1Promise对象状态Promise有3种状态:pending、fulfilled、rejected。而且任何时候都只能处于一种状态。pendingPromise1.1可以变成fulfilled或rejected状态。Promiseinfulfilled2.1不能转移到其他状态2.2必须有值,并且值是固定的promise的状态,最终状态下的promise必须有一个值。这就是promise的定义:它代表了一个异步操作的最终结果。3.2then方法promise对象必须提供一个then方法来访问promise在最终状态(fullfilled或rejected)中表示的值。then方法接收两个参数:promise.then(onFulfilled,onRejected)onFulfilled和onRejected参数是可选的。如果它们是非函数,则参数将被忽略。如果onFulfilled是一个函数2.1Promise处于且仅处于fulfilled状态,称为函数,Promise的值是函数的第一个参数2.2如果onRejected是一个函数,函数最多只能被调用一次3.1的function在promise处于且仅处于rejected状态时被调用,promise的reason是function的reason第一个参数3.2这个函数最多只能调用一次,promise的最终结果只能是一个value,所以回调函数onFullFilled和onRejected也只有一个形参。但规范并没有以这种方式限制它,“作为它的第一个论点”。它只要求必须异步调用作为第一个参数的onFulfilled或onRejected。onFulfilled和onRejected函数必须作为函数调用,即不绑定this参数。同一个promise的then方法可以调用多次。6.1多次注入的onFulfilled和onRejected回调函数的调用顺序取决于then方法的调用顺序。then方法必须返回一个promisepromise2=promise1.then(onFulfilled,onRejected);7.1如果onFulfilled或onRejected返回值x,执行Promise解析过程[[Resolve]](promise2,x)7.2如果onFulfilled或onRejected抛出异常e,promise2必须以e为原因被拒绝。7.3如果onFulfilled不是一个函数并且Promise1已经被fulfilled,那么Promise2也必须变成fulfilled,并且promise1的Value作为它的Value7.4如果onRejected不是一个函数并且Promise1已经被拒绝,那么Promise2也必须变成rejected,并且以promise1的原因为它的原因,promise2的最终状态与promise1没有直接关系,只和onReject和onFullFilled回调函数有关。then方法构建Promise对象链。重点也是难点。Promise链中相邻节点的影响。(PromiseResolutionProcedurePromise解析过程是一个抽象操作,输入参数是一个promise和一个value。可以表示为:[[Resolve]](promise,x),如果x是一个thenable(包含promise对象),那么trytomakepromise采用x的状态,否则将promise变为fulfilled并裁剪x作为它的Value。这个方法是为了thenables和promise可以互操作(注意thenable和Promise的区别)。thenable的then方法规则不必须符合PromiseA+规范,这样我们才能自定义then方法的行为,Promose解析过程规范主要定义了Promise对象链(then方法构建的promise链)中相邻的两个promise对象之间的关系,可以表示为promise2=promise1.then(onFulfilled,onRejected);.但是需要注意的是,后面的promise2对象的finalstate与前面的promise1没有直接关系,只与onReject和onFullFilled回调有直接关系functions:是函数执行还是抛出异常。函数的返回值只是当promise1被fullfilled并且onFulfilled不是一个函数或者promise1被拒绝并且onRejected不是一个函数时,promise2的状态取决于promise1的状态。3.4[[Resolve]](promise,x)的具体处理步骤如果promise和x相等,则拒绝promise,并制定TypeError作为promise的原因。Promise对象无法处理自己的状态。如果x是一个Promise,则使用它的状态(即promise的状态必须与x一致):2.1如果x是pending,则promise也将是pending,直到x被履行或拒绝。2.2如果x被实现,则promise变为fulfilled,并使用x的值作为promise的值。2.3如果x被拒绝,则promise变为rejected,x的原因作为promise的原因。覆盖x是一个对象或函数:3.1varthen=x.then3。2如果访问x.then导致异常e,将promise变为rejected,原因为e.3.3如果then是一个函数,则执行then.call(x,resolvePromise,rejectedPromise)3.3.1如果调用resolvePromise(y),然后执行[[Resolve]](promise,y)3.3.2如果调用了rejectedPromise(r),将promise变为rejected,reason为r3.3.3如果同时或多次调用rejectedPromise,resolvePromise,只有第一个调用有效,其他调用忽略3.3.4如果调用发生异常则e1)如果resolvePromise或rejectedPromise已经被调用,则忽略异常2)否则,将promise转为rejected,及其原因ise3.4如果then不是A函数(即不是thenable),则将promise转为fulfilled,值为x(不是then);否则,将promise转为fulfilled,值为x注:thenable对象的Promise解析过程与promise对象的处理方式不同,thenable对象是递归处理的(谨防死循环)。是不是觉得thenable对象的then方法很少用到?!事实上,我们一直在使用它。ES6中Promise函数的回调函数参数按照3.3规则处理。参考Promises/A+liepromisesourcecode阅读Asmall,performantpromiselibraryimplementationES6Promise
