大家都知道 ,koa 最有特点之一就是 他的 洋葱模型 可以从外往里执行
今天也来实现一下
const middleWares = [];
middleWares.push((next: Function) => {
console.log(1);
next(); // tag2
console.log(1.1);
});
middleWares.push((next: Function) => {
console.log(2);
next();
console.log(2.1);
});
middleWares.push((next: Function) => {
console.log(3);
next();
console.log(3.1);
});
let fn = compse(middleWares);
fn(); // tag1
要求是通过实现
compse输出1 2 3 3.1 2.1 1.1
function compse(middleWares: Function[]) {
let copyMiddleWares = [...middleWares],
index = 0;
let fn = () => {
if (index >= copyMiddleWares.length) return;
let middleFn = copyMiddleWares[index];
index++;
return middleFn(fn); // tag2
};
return fn; //tag1
}
其实代码很简单,可以说是利用了
闭包的原理
当你第一次执行的函数,执行的是 外层的tag1
使用next的时候,执行的是tag2,next指代的是 index 为1 的fn函数
next=>{
console.log(1) //
next 指代的是他=> {
if (index >= copyMiddleWares.length) return;
let middleFn = copyMiddleWares[index];
index++;
return middleFn(fn);// 执行 1,然后fn 放进去
// 可以想象成 fn 替换 这个next 的过程
}
console.log(1.1)
}
console.log(1)
next=> console.log(2)
next=> console.log(3)
console.log(3.1)
console.log(2.1)
console.log(1.1)
一个数组函数自执行,肯定是当你执行完第一个的时候,把第二个拿出来执行,这次只不过,需要一个
next函数来改变执行顺序
note:来自www.bilibili.com/video/BV1ug… 2022,5,15 20:05