Серия Nodejs async - передает аргументы в следующий обратный вызов
Когда вы используете асинхронный модуль, как вы можете передать аргументы из предыдущего обратного вызова на следующий?
Вот пример из документов github
async.series({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
}
},
function(err, results) {
// results is now equal to: {one: 1, two: 2}
});
Ответы
Ответ 1
Вы можете связать воедино асинхронные функции с помощью функции waterfall
асинхронного модуля. Это позволяет вам сказать: "сначала выполните x, затем передайте результаты в функцию y и передайте результаты этого в z". Скопировано из [документов] [1]:
async.waterfall([
function(callback){
callback(null, 'one', 'two');
},
function(arg1, arg2, callback){
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
function(arg1, callback){
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
Вам не нужен строго асинхронный модуль для этого; эта функция предназначена для облегчения чтения кода. Если вы не хотите использовать асинхронный модуль, вы всегда можете просто использовать традиционные обратные вызовы.
Ответ 2
Другой вариант - использовать async.auto. С помощью async auto вы можете указать данные зависимости для задачи, и async начнет запускать ее, когда сможет. В README.md есть хороший пример, но вот примерно ваша серия сверху:
async.auto({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
// If two does not depend on one, then you can remove the 'one' string
// from the array and they will run asynchronously (good for "parallel" IO tasks)
two: ['one', function(callback, results){
setTimeout(function(){
callback(null, 2);
}, 100);
}],
// Final depends on both 'one' and 'two' being completed and their results
final: ['one', 'two',function(err, results) {
// results is now equal to: {one: 1, two: 2}
}];
});
Ответ 3
Я потратил немало времени на решение этой проблемы, потому что столкнулся с подобной ситуацией. Я попробовал как async.series
, так и async.waterfall
.
async.series
:
Используется переменная для совместного использования функций обратного вызова. Я не уверен, что это лучший способ сделать это. Я должен отдать должное Sebastian за его замечательную статью о async
.
var async1 = require('async');
exports.asyncSeries1 = function (req, res, callback) {
var sharedData = "Data from : ";
async1.series([
// First function
function(callback) {
sharedData = "First Callback";
callback();
},
// Second function
function(callback){
console.log(sharedData);
sharedData = "Second Callback";
callback();
}
],
// Final callback
function(err) {
console.log(sharedData);
if (err) {
callback();
}
callback();
}
);
};
async.waterfall
: я попытался использовать другую функцию обратного вызова, используя async.apply
. Вот фрагмент кода, который помог мне решить проблему.
`
var async2 = require('async')
exports.asyncWaterfall1 = function (arg1, arg2, cb) {
async2.waterfall([
// async.apply
async2.apply(assignVariables, arg1, arg2),
// First callback
function(arg1, arg2, callback){
console.log(arg1);
console.log(arg2);
arg1 = 5;
arg2 = 6;
callback(null, arg1, arg2);
},
// Second callback
function(arg1, arg2, callback){
// arg1 now equals 'one' and arg2 now equals 'two'
console.log(arg1);
console.log(arg2);
arg1 = 7;
arg2 = 8;
callback(null, arg1, arg2);
}
],
function (err, arg1, arg2) {
console.log(arg1);
console.log(arg2);
});
};
// Method to assign variables
function assignVariables(arg1, arg2, callback) {
console.log(arg1);
console.log(arg2);
arg1 = 3;
arg2 = 4;
callback(null, arg1, arg2);
};
PS: Кредит.