一尉辑、原型
async function fn1(next)
{
console.log("fn1")
await next()
console.log('end fn1')
}
async function fn2(next)
{
console.log("fn2")
await delay()
await next()
console.log('end fn2')
}
async function fn3(next)
{
console.log("fn3")
}
function delay()
{
return new Promise((r)=>{
setTimeout(()=>{
r();
},2000)
})
}
function compose(middlewares=[fn1,fn2,fn3])
{
function dispatch(i)
{
let fn=middlewares[i]
if(!fn){
return Promise.resolve()
}
else
{
return new Promise((resolve)=>{
resolve(fn(function next () {
return dispatch(i + 1)
}));
});
}
}
return dispatch(0);
}
運(yùn)行:
compose();
輸出:
fn1
fn2
fn3 // after 2s
end fn2
end fn1
二、轉(zhuǎn)碼
相當(dāng)于:
function compose()
{
return new Promise((resolve)=>{
resolve(function(next){
console.log("fn1")
next().then(()=>{
console.log('end fn1')
});
}(
function(){
return new Promise((resolve2)=>{
resolve2(function(next2){
console.log("fn2")
return new Promise((resolve3)=>{
setTimeout(()=>{
resolve3();
},2000)
}).then(()=>{
next2().then(()=>{
console.log('end fn2')
});
})
}(
function(){
console.log("fn3")
return Promise.resolve(); 、
}
));
});
}
));
});
}
外層Promise.resolve
接收內(nèi)層返回的Promise
對(duì)象泻轰,外層會(huì)等待內(nèi)層對(duì)象轉(zhuǎn)為resolved
狀態(tài)后才會(huì)執(zhí)行莉御。
var p1= new Promise(function(resolve,reject){
setTimeout(function(){
resolve("ok")
},2000)
})
var p2= new Promise(function(resolve,reject){
resolve(p1) // resolve了一個(gè)promise
})
p2.then(function(res){
console.log(res) // “ok" after 2s
})