一、原型
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);
}
运行:
compose();
输出:
fn1
fn2
fn3 // after 2s
end fn2
end fn1
二、转码
相当于:
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
接收内层返回的Promise
对象,外层会等待内层对象转为resolved
状态后才会执行。
var p1= new Promise(function(resolve,reject){
setTimeout(function(){
resolve("ok")
},2000)
})
var p2= new Promise(function(resolve,reject){
resolve(p1) // resolve了一个promise
})
p2.then(function(res){
console.log(res) // “ok" after 2s
})
网友评论