Promise 的链式调用
我们可以用 Promise.prototype.then()方法将进一步的操作与一个变为已敲定状态的 promise 关联起来。
Promise.then() 方法需要两个参数,第一个参数作为处理已成功状态的回调函数,而第二个参数则作为处理已失败状态的回调函数。每一个 .then() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用,就像这样:
const MyPromise=new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('value');
},0)
});
MyPromise.then(resolveA,rejectA)
MyPromise.then(resolveB,rejectB)
当 .then() 中缺少能够返回 promise 对象的函数时,链式调用就直接继续进行下一环操作。
由上可知:
.then() 方法返回一个新的 promise 实例,为了在 promise 状态发生变化时(resolve / reject 被调用时)再执行 then 里的函数,我们使用一个 callbacks 数组先把传给then的函数暂存起来,等状态改变时再调用。
为了保证后一个 then 里的方法在前一个 then(可能是异步)结束之后再执行
我们可以将传给 then 的函数和新 promise 的 resolve 一起 push 到前一个 promise 的 callbacks 数组中。当前一个 promise 完成后,调用其 resolve 变更状态,在这个 resolve 里会依次调用 callbacks 里的回调,这样就执行了 then()的方法;当 then() 的方法执行完成后,返回一个结果,如果这个结果是个简单的值,就直接调用新 promise 的 resolve,让其状态变更,然后依次调用新 promise 的 callbacks 数组里的方法,循环往复。。如果返回的结果是个 promise,则需要等它完成之后再触发新 promise 的 resolve,所以可以在其结果的 then 里调用新 promise 的 resolve。
MyPromise.prototype.then=function(onfulFilled,onReject){
//保存前一个promise的this
const self=this;
let myPromise=new MyPromise((resolve,reject)=>{
//封装前一个promise成功时执行的函数
let fulFilled=()=>{
try{
const result=onFulfilled(self.value);
//判断前一个promise函数执行完后返回值是否为promise
return result instanceof MyPromise?result.then(resolve,reject):resolve(result);
}catch(e){
reject(e);
}
}
// 封装前一个promise失败时执行的函数
let rejected=()=>{
try{
const result=OnReject(self.err);
return result instanceof MyPromise?result.then(resolve,reject):reject(result);
}catch(e){
reject(e);
}
}
switch(self.status){
case "pending":
self.onFulFilledCallbacks(fulfilled);
self.onRejectedCallbacks(rejected);
break;
case "resolved":
fulfilled();
break;
default "rejected":
rejected();
break;
}
});
return myPromise;
}