我有以下代码,我在异步任务完成后调用回调:
var async = require("async");
function _callback(err, result){
if(err) console.log('Error Occurred');
console.log('Callback called');
console.dir(result);
}
function tasks() {
console.log('Start executing tasks');
var tasks = [];
var result = {};
tasks.push(function(_callback) {
console.log('Getting some data');
_callback(null, result);
});
tasks.push(function(_callback) {
console.log('Second function called');
_callback(null, result);
});
async.series(tasks, function(){
console.log('All done');
});
}
tasks();
我已经检查了异步库中预期的语法。代码看起来与我类似。
有人可以指出这里需要改变什么。
答案 0 :(得分:1)
试试这样:
var async = require("async");
function _callback(err, result){
if(err) console.log('Error Occurred');
console.log('Callback called');
console.dir(result);
}
function tasks() {
console.log('Start executing tasks');
var tasks = [];
var result = {};
tasks.push(function(next) {
console.log('Getting some data');
next(null, result);
});
tasks.push(function(_callback) {
console.log('Second function called');
next(null, result);
});
async.series(tasks, function(err, result){
console.log('All done');
_callback(err, result);
});
}
tasks();
Async为每个任务提供一个回调,您需要调用该回调以便在此任务完成时让异步。
完成所有任务后,您可以拨打回叫。
如果您希望在每个任务完成后调用回调,则只需在每个任务之前添加
next(null, result)
也是_callback(null, result)
对您的实现无效的原因是您使用具有相同名称的参数覆盖global _callback方法。
希望有道理:)
答案 1 :(得分:1)
正如你现在的代码所示,上面定义的_callback
函数永远不会被调用,因为任务函数中的_callback
是async
传递的范围。
// this will never get called
function _callback(err, result){
if(err) console.log('Error Occurred');
console.log('Callback called');
console.dir(result);
}
function tasks() {
console.log('Start executing tasks');
var tasks = [];
tasks.push(function(_callback) { // the _callback here overrides the one above for this closure
console.log('Getting some data');
_callback(null, result);
});
// ... more tasks
async.series(tasks, function(){
console.log('All done');
});
}
如果您想重用_callback
函数中的逻辑,我建议将async
回调作为参数传递给它:
// rename some functions to avoid silly js scoping mysteries
function myCallback(err, result, asyncCallback){
// shared logic here
if(err) console.log('Error Occurred');
console.log('Callback called');
console.dir(result);
asyncCallback(null, result);
}
// ...
tasks.push(function(asyncCallback) { // the _callback here overrides the one above for this closure
console.log('Getting some data');
myCallback(null, result, asyncCallback);
});
// ... more tasks
async
希望调用它的回调,以便它知道何时继续,但这并不意味着你不能用自己的处理程序拦截它:P。
答案 2 :(得分:0)
您不需要对_callback进行函数调用。你可以像这样简化它。
var async = require("async");
function doSomeLogic(item, callback) {
console.log(item);
callback(null, item + 2);
}
function tasks() {
console.log('Start executing tasks');
var tasks = [];
var result = {};
tasks.push(function(callback){
// do some more stuff ...
callback(null, 'one');
});
tasks.push(function(callback){
// do some more stuff ...
callback(null, 'two');
});
async.series(tasks, function(error, results) {
if (error) {
console.log(error);
}
console.log(results);
console.log('All done');
});
}
tasks();