Выполнение функций последовательно
-
14-10-2019 - |
Вопрос
Прежде всего ... С Новым годом!
Не могли бы вы объяснить мне, как это работает? Я просмотрел Соединятьs (https://github.com/senchalabs/connect) исходный код, но я его не понимаю.
Я хотел бы написать это самостоятельно.
app.get(
'/',
function(req, res, next) {
// Set variable
req.var = 'Happy new year!';
// Go to next function
next();
},
function(req, res, next) {
// Returns 'Happy new year!'
console.log(req.var); // <- HOW IS THIS POSSIBLE?
// (...)
}
);
Заранее спасибо!
Решение
Кажется, как если бы первый аргумент функции, который вы предоставляете, вызывается get()
функционируйте первым.
Когда это называется, 3 параметра предоставляются для вызова. Внутри звонка req
Параметр должен быть объектом, которому вы можете назначить свойства. Вы назначили var
свойство и дал ему значение 'Happy new year!'
.
Следующий аргумент функции, который вы проходите, вызывается по вызову в next()
Параметр и 3 параметра снова предоставляются для вызова. Первый параметр, по -видимому, тот же объект, который был дан первым вызовам, где вы назначили var
имущество.
Поскольку это (очевидно) тот же объект, назначенное вами свойство все еще присутствует.
Вот простой пример: http://jsfiddle.net/dwfrv/1/ (Откройте консоли)
// The main get() function. It has two function parameters.
function get(fn1, fn2) {
// create an empty object that is passed as argument to both functions.
var obj = {};
// create a function that is passed to the first function,
// which calls the second, passing it the "obj".
var nxt = function() {
fn2(obj); //When the first function calls this function, it fires the second.
};
// Call the first function, passing the "obj" and "nxt" as arguments.
fn1(obj, nxt);
}
// Call get(), giving it two functions as parameters
get(
function(req, next) {
// the first function sets the req argument (which was the "obj" that was passed).
req.msg = 'Happy new year';
// the second function calls the next argument (which was the "nxt" function passed).
next();
},
function(req) {
// The second function was called by the first via "nxt",
// and was given the same object as the first function as the first parameter,
// so it still has the "msg" that you set on it.
console.log(req.msg);
}
);
Обратите внимание, что это очень упрощенный пример с меньшим количеством параметров в функциях. Не то, что я изменился var
к msg
поскольку var
это зарезервированное слово.
Другие советы
Если хотите, попробуйте использовать Asyncodule. Это значительно облегчает возможность работать последовательно, параллели или использовать бассейн.