理解`use`/堆栈创建,中间件模式

问题描述

我正在尝试了解以下代码的工作原理。

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 (将#修改为@)