var A = args => new Promise(resolve => { setTimeout(() => { console.log('A', args) // 初始化,自定义的值 resolve(1) }, 5000) }) var B = args => new Promise(resolve => { setTimeout(() => { console.log('B', args) // 输出的是 上一个函数返回值 1 resolve(2) }, 2000) }) var C = args => new Promise(resolve => { setTimeout(() => { console.log('C', args) // 输出的是 上一个函数返回值 2 resolve(3) }, 3000) })function compose (queue, val) { queue.reduce(async (a,b)=>{ // async会返回一个promise console.log('11111',a) console.log('222222222',b) let res if(typeof a === 'function'){ res = await a(val) }else{ res = await a } return b(res) })}compose([A,B,C], 100)
koa洋葱模型 reduce
var A = args => new Promise(resolve => {
setTimeout(() => {
console.log('A', args) // 初始化,自定义的值
resolve(1)
}, 5000)
})
var B = args => new Promise(resolve => {
setTimeout(() => {
console.log('B', args) // 输出的是 上一个函数返回值 1
resolve(2)
}, 2000)
})
var C = args => new Promise(resolve => {
setTimeout(() => {
console.log('C', args) // 输出的是 上一个函数返回值 2
resolve(3)
}, 3000)
})
const app = {
middlewares: []
};
// 创建 use 方法
app.use = function(fn) {
app.middlewares.push(fn);
};
app.use(async (next, arg) => {
console.log(1);
const val = await A(arg)
await next(val);
console.log(2);
});
app.use(async (next,arg) => {
console.log(3);
const val = await B(arg)
await next(val);
console.log(4);
});
app.use(async ( next,arg) => {
console.log(5);
const val = await C(arg)
await next(val);
console.log(6);
});
app.compose1 = function(arg) {
// 递归函数
function dispatch(index, arg) {
// 如果所有中间件都执行完跳出
if (index === app.middlewares.length) return;
// 取出第 index 个中间件并执行
const useFn = app.middlewares[index];
return useFn((val) => dispatch(++index,val), arg);
}
// 取出第一个中间件函数执行
return dispatch(0, arg);
}