Как работает обратный вызов в async.parallel (откуда он берется?)
Я нашел этот пример в документации. Я понимаю, как работает основной обратный вызов (функция (ошибка, результаты)...), но что такое параметр обратного вызова, который передается в одну и две функции? Откуда эти люди и что они делают?
async.parallel({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
}
},
function(err, results) {
// results is now equals to: {one: 1, two: 2}
});
2 ответа
callback
Аргумент передается вашим функциям асинхронной инфраструктурой. Он указывает на функцию внутри async (хотя это не то, что вам нужно знать). Асинхронная инфраструктура передает его вам и просит позвонить в нужное время.
Вот как вы возвращаетесь в асинхронную библиотеку, чтобы сообщить ей, что ваша асинхронная функция завершила свою работу, а также, была ли она завершена успешно или с ошибкой. Когда ваша функция завершает свою работу, вы вызываете эту функцию, и она уведомляет асинхронную библиотеку о том, что этот шаг процесса теперь выполнен (либо с ошибкой, либо с успехом).
К вашему сведению, если вы знакомы с промежуточным программным обеспечением Express в node.js, оно очень похоже на next
аргумент, который передается промежуточному программному обеспечению. Когда вызывается ваше промежуточное ПО, один из аргументов, переданных ему, это next
Перезвоните. Ваше промежуточное программное обеспечение выполняет свою работу (которая может быть асинхронной), а затем, когда оно выполнено, оно сообщает инфраструктуре Express, что оно выполнено, вызывая next()
обратный вызов, который был передан ему.
Вот несколько похожий пример из Express:
app.use(function (req, res, next) {
doSomethingAsync(function() {
next();
})
});
Он никуда не приходит, просто работает библиотека, для передачи данных в следующую функцию используется обратный вызов.
Это функция здесь:
function _parallel(eachfn, tasks, callback) {
callback = callback || noop;
var results = isArrayLike(tasks) ? [] : {};
eachfn(tasks, function (task, key, callback) {
task(rest(function (err, args) {
if (args.length <= 1) {
args = args[0];
}
results[key] = args;
callback(err);
}));
}, function (err) {
callback(err, results);
});
}
https://github.com/caolan/async/blob/master/dist/async.js#L3471