const add = (x,y) => x+y
const square = z => z *z
//中间件思想,把多个函数进行融合
// (...args) 意思是返回新函数
// const compose = (fn1,fn2) => (...args) => fn2(fn1(...args))
// const compose = (...[first,...other]) => (...args) => {
// let ret = first(...args)
// other.forEach(fn=>{
// ret = fn(ret)
// })
// return ret
// }
function compose(middlewares){
return function(){
//dispatch(0) 从第一个开始执行
return dispatch(0)
//dispatch 里的i表示执行的是第几个方法
function dispatch(i){
let fn = middlewares[i]
if(!fn){
return Promise.resolve()
}
return Promise.resolve(
fn(function next(){
//执行下一个函数
return dispatch(i+1)
})
)
}
}
}
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((resolve,reject)=>{
setTimeout(() => {
resolve()
}, 2000);
})
}
const middlewares = [fn1,fn2,fn3]
const finalFn = compose(middlewares)
finalFn()
// const fn =compose(add,square,square)
// const fn = (x,y) => square(add(x,y))
// console.log(fn(1,2))
最后用node 文件名查看结果