洋葱模型原理: 把后一个函数当做参数传递给前一个函数,从而实现把多个函数串起来执行的效果。
举个栗子,有如下三个函数fn1, fn2, fn3,洋葱模型的输出结果应该是:1 3 5 6 4 2。注意:参数next是一个函数。
function fn1(next) {
console.log(1);
next();
console.log(2);
}
function fn2(next) {
console.log(3);
if(next) next();
console.log(4);
}
function fn3(next) {
console.log(5);
if(next) next();
console.log(6);
}
复制代码
1、递归写法
let middlewares = [fn1, fn2, fn3];
function dispatch(index) {
if (index === middlewares.length) return;
let m = middlewares[index++];
return () => m(dispatch(index))
}
dispatch(0)(); //注意:每次调用dispatch,返回的都是一个函数
复制代码
2、箭头函数写法
let finalFn = () => fn1(() => fn2(() => fn3()))
finalFn();
复制代码
3、丑陋的原始嵌套写法
function fn1() {
console.log(1);
(function fn2() {
console.log(3);
(function fn3(next) {
console.log(5);
//next();
console.log(6);
})();
console.log(4);
})();
console.log(2);
}
fn1();
复制代码