首先,给出一个最小demo的代码
import { Func } from ".";
export const compose = (middleware: Func[]) => {
const dispatch = (i: number) => {
const fn = middleware[i];
if (!fn) {
return Promise.resolve();
}
return Promise.resolve(fn(dispatch.bind(null, i + 1)));
};
return dispatch(0);
};
import { compose } from "./compose";
export type Func = (args: (args?: any) => any) => any;
const arr: number[] = [];
const stack: Func[] = [];
const func1: Func = (next) => {
arr.push(1);
next();
arr.push(6);
};
const func2: Func = (next) => {
arr.push(2);
next();
arr.push(5);
};
const fun3: Func = (next) => {
arr.push(3);
next();
arr.push(4);
};
stack.push(func1, func2, fun3);
compose(stack);
console.log(arr); // 1 2 3 4 5 6
我们知道koa的原理是洋葱模型,也就是当代码执行到next()函数的时候,会执行下一个中间件,等待下一个中间件执行完成之后,接着执行next()函数之后的代码。
那么怎么才能达到这样的目的呢?
答案是我们可以将第二个中间件函数作为第一个的next()函数来传递,这样我们执行next()函数的时候,就会执行下一个中间件。那么同样地,下一个中间件执行next()函数的时候,也会调用下一个中间件,当最后一个中间件执行完成之后,我们会接着执行其他中间件next()函数下方的代码,就如同洋葱一样穿插。