问题描述
let middleware = []
middleware.push((next) => {
console.log(1)
next()
console.log(1.1)
})
middleware.push((next) => {
console.log(2)
next()
console.log(2.1)
})
middleware.push((next) => {
console.log(3)
next()
console.log(3.1)
})
let fn = compose(middleware)
fn()
function compose(middlewares) {
}
思路解析
- 如果是同步方法,关键就是 next 函数的实现,next需要调用想下一个中间件,如果为空则不执行;
- 如果需要支持异步方法,需要支持返回一个 Promise
代码实现
- 同步执行方式,只需要递归执行
function compose(middlewares) {
let count = 0;
const next = () => {
if (count >= middlewares.length) {
return;
}
middlewares[count++](next);
}
return next;
}
- 异步方法
function compose(middlewares) {
return function (context = null) {
const next = (count) => {
const fn = middlewares[count];
if (!fn) return Promise.resolve();
return Promise.resolve(fn.call(context, next.bind(null, count+1)));
}
return next(0);
}
}