Node.js async.series - это то, как он должен работать?
var async = require('async');
function callbackhandler(err, results) {
console.log('It came back with this ' + results);
}
function takes5Seconds(callback) {
console.log('Starting 5 second task');
setTimeout( function() {
console.log('Just finshed 5 seconds');
callback(null, 'five');
}, 5000);
}
function takes2Seconds(callback) {
console.log('Starting 2 second task');
setTimeout( function() {
console.log('Just finshed 2 seconds');
callback(null, 'two');
}, 2000);
}
async.series([takes2Seconds(callbackhandler),
takes5Seconds(callbackhandler)], function(err, results){
console.log('Result of the whole run is ' + results);
})
Результат выглядит следующим образом:
Starting 2 second task
Starting 5 second task
Just finshed 2 seconds
It came back with this two
Just finshed 5 seconds
It came back with this five
Я ожидал, что функция take2Second завершится полностью до начала take5Second.
Так оно и должно работать. Пожалуйста, дайте мне знать.
И последняя функция никогда не запускается. Благодарю.
Ответы
Ответ 1
Не совсем. Вы выполняете функции сразу (как только массив оценивается), поэтому они, похоже, запускаются в одно и то же время.
Обратный вызов, передаваемый каждой из выполняемых функций, является внутренним для асинхронной библиотеки. Вы выполняете его, как только ваша функция завершится, передав ошибку и/или значение. Вам не нужно самостоятельно определять эту функцию.
Конечная функция никогда не запускается в вашем случае, потому что функция обратного вызова, которую асинхронный вызов вам нужно вызвать для перехода к следующей функции в серии, никогда не будет выполняться (выполняется только ваша функция callbackHandler
).
Попробуйте это вместо:
async.series([
takes2Seconds,
takes5seconds
], function (err, results) {
// Here, results is an array of the value from each function
console.log(results); // outputs: ['two', 'five']
});
Ответ 2
Джеймс дал хороший обзор async.series
. Обратите внимание, что вы можете настроить анонимные функции в массиве серий, а затем вызвать свои фактические функции с параметрами
var async = require('async')
var param1 = 'foobar'
function withParams(param1, callback) {
console.log('withParams function called')
console.log(param1)
callback()
}
function withoutParams(callback) {
console.log('withoutParams function called')
callback()
}
async.series([
function(callback) {
withParams(param1, callback)
},
withoutParams
], function(err) {
console.log('all functions complete')
})
Ответ 3
Мой предпочтительный способ создания серии async - использовать операционный массив следующим образом:
var async = require('async'),
operations = [];
operations.push(takes2Seconds);
operations.push(takes5seconds);
async.series(operations, function (err, results) {
// results[1]
// results[2]
});
function takes2Seconds(callback) {
callback(null, results);
}
function takes5seconds(callback) {
callback(null, results);
}
Ответ 4
async.series
([
function (callback)
{
response=wsCall.post(user,url,method,response);
console.log("one");
callback();
}
,
function (callback)
{
console.log("two");
//console.log(response);
callback();
}
]
,
function(err)
{
console.log('Both a and b are saved now');
console.log(response);
});
Ответ 5
В async.series
все функции выполняются последовательно, и объединенные выходы каждой функции передаются на окончательный обратный вызов. например
var async = require('async');
async.series([
function (callback) {
console.log('First Execute..');
callback(null, 'userPersonalData');
},
function (callback) {
console.log('Second Execute.. ');
callback(null, 'userDependentData');
}
],
function (err, result) {
console.log(result);
});
Вывод:
First Execute..
Second Execute..
['userPersonalData','userDependentData'] //result