问题描述
我正在尝试了解以下代码的工作原理。
class Middleware {
constructor(obj) {
obj = obj || this;
Object.defineProperty(this,"__obj",{
value: obj
});
Object.defineProperty(this,"start",{
value: (...args) => {
args[args.length - 1].apply(obj,args.slice(0,-1));
},writable: true
});
};
use(fn) {
this.start = (stack => {
return (...args) => {
stack(...args.slice(0,-1),() => {
fn.call(this.__obj,...args.slice(0,args[args.length - 1].bind(this.__obj,-1)));
});
}
})(this.start);
};
};
// EXAMPLE
const middleware = new Middleware();
middleware.use((date,{data},next) => {
console.log("use #1",date);
setTimeout(next,1000);
});
middleware.use((date,next) => {
console.log("use #2",date);
next(new Error("TEST"));
});
middleware.use((date,next) => {
console.log("use #3",1000);
});
middleware.start(Date.Now(),{
data: true
},(err) => {
console.log("final",err)
});
让我发疯的是 use
函数,它“覆盖”了 start
函数并创建了一个回调堆栈。有人可以解释一下这是如何工作的吗?
我在github上找到了代码:https://gist.github.com/aronanda/d31bb47918145a5aace6005f172e035d
我想创建一个“中止”机制,当您将错误对象传递给 next
函数时,它会直接跳转到您传递给 start
方法的“最终”回调,错误作为参数。
但为此我需要了解 use
函数内部发生了什么。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)