Целью этого кода, по-видимому, является создание последовательности функций, которые затем будут запускаться одна за другой.
Задача метода 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))
}