Объясните функцию Middleware - PullRequest
0 голосов
/ 10 ноября 2018

Кто-нибудь может дать мне урок, как работает эта функция? Я не могу понять, как работает эта функция. Как на самом деле работает эта функция. Любая помощь будет оценена. Спасибо

var Middleware = function() {};

Middleware.prototype.use = function(fn) {
  var self = this;

  this.go = (function(stack) {
    return function(next) {
      stack.call(self, function() {
        fn.call(self, next.bind(self));
      });
    }.bind(this);
  })(this.go);
};

Middleware.prototype.go = function(next) {
  next();
};

ИСПОЛЬЗОВАНИЕ

var middleware = new Middleware();

middleware.use(function(next) {
  var self = this;
  setTimeout(function() {
    self.hook1 = true;
    console.log('a')
    next();
  }, 10);
});

middleware.use(function(next) {
  var self = this;
  setTimeout(function() {
    self.hook2 = true;
    console.log('b')
    next();
  }, 10);
});

var start = new Date();
middleware.go(function() {
  console.log(this.hook1); // true
  console.log(this.hook2); // true
  console.log(new Date() - start); // around 20
});

1 Ответ

0 голосов
/ 10 ноября 2018

Целью этого кода, по-видимому, является создание последовательности функций, которые затем будут запускаться одна за другой.

Задача метода go - запустить некоторый код. Если вы никогда не вызывали use, то go запустит указанный код немедленно, без осложнений.

Метод use позволяет вставлять дополнительные шаги для запуска. Когда вы вызываете use, оригинальный метод go заменяется новым методом. Этот новый метод вызовет старый метод go, а затем ваш пользовательский метод. Если use вызывается несколько раз, это создает последовательность функций. Функции будут вызываться в том порядке, в котором они были переданы для использования. Следующая функция запускается, когда предыдущая функция вызывает next().


Большая сложность кода заключается в том, что значение this остается таким, каким оно и должно быть. Если бы это не было требованием, то use можно переписать так:

Middleware.prototype.use = function(fn) {
  const oldGo = this.go;
  this.go = next => oldGo(() => fn(next))
}
...