// 责任链模型(一个接一个执行)
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()