// 责任链模型(一个接一个执行)
const fn1 = (x, y) => x + y;
const fn2 = (z) => z * z;
// 正常组合
const compose = (fn1, ...other) => (...args) => {
let ret = fn1(...args);
other.forEach(item => {
ret = item(ret);
});
return ret;
}
// redux 中间件组合方式
const reduxCompose = (...fns) => fns.reduce((a, b) => (...args) => b(a(...args)))
const fn = reduxCompose(fn1, fn2);
console.log(fn(1, 2));
// 洋葱圈模型(一半一半执行)
const koaCompose = (middlewares) => {
return function () {
return dispatch(0);
function dispatch(idx) {
const fn = middlewares[idx];
if (!fn) {
return Promise.resolve();
}
return Promise.resolve(
fn(function next() {
return dispatch(idx + 1)
})
)
}
}
};
async function func1(next) {
console.log("func1");
await next();
console.log("func1 end");
}
async function func2(next) {
console.log("func2");
await delay();
await next();
console.log("func2 end");
}
async function func3(next) {
console.log("func3");
}
async function delay() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 2000);
})
}
const middlewares = [func1, func2, func3];
const finaFn = koaCompose(middlewares);
finaFn()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。