我希望只在函数f1和f2完成后调用函数cb(注意f1和f2是异步的,它们可能在任何时候都不按顺序调用)。
我试图实现类似的功能,但它似乎不是在node.js上执行此操作的最佳方式。
var l1 = false;
var l2 = false;
// function to be called after f1 and f2 have ended
function cb(err, res) {
if (err) {
console.log(err);
} else {
console.log('result = ' + res);
}
}
// f1 and f2 are practically identicals...
function f1(callback) {
console.log('f1 called');
l1 = true;
if (l2) {
console.log('f1 calling cb');
callback(null, 'one');
} else {
console.log('f2 wasn\'t called yet');
}
}
function f2(callback) {
console.log('f2 called');
l2 = true;
if (l1) {
console.log('f2 calling cb');
callback(null, 'two');
} else {
console.log('f1 wasn\'t called yet');
}
}
setTimeout(function() {
f1(cb); // will call cb
}, 3000);
setTimeout(function() {
f2(cb); // won't call cb
}, 1000);
// It will print:
// f2 called
// f1 wasn't called yet
// f1 called
// f1 calling cb
// result = one
答案 0 :(得分:3)
var async = require('async');
console.log('before invocation');
async.parallel([
function f1(cb) {
console.log('f1 invoked');
setTimeout(function () {
console.log('f1 calling back');
cb(null, 'one');
}, 3000);
},
function f2(cb) {
console.log('f2 invoked');
setTimeout(function () {
console.log('f2 calling back');
cb(null, 'two');
}, 1000);
}
], function callback(err, results) {
console.log('callback invoked');
if (err) {
console.log(err);
} else {
console.log('results: ', results);
}
});
console.log('after invocation');
setTimeout(function () {
console.log('2 seconds later...');
}, 2000);
输出:
before invocation
f1 invoked
f2 invoked
after invocation
f2 calling back
2 seconds later...
f1 calling back
callback invoked
results: [ 'one', 'two' ]
请原谅我没有完全复制你的情景,但我承认你所拥有的只是一个模型。
唯一的区别是最终回调包含并行执行的每个函数的结果数组,并且在每个函数内部调用setTimeout()
。
请注意,返回的数组是['one', 'two']
,因为这是传递给async.parallel()
的函数的顺序。提供给每个函数的cb
参数由async生成,它会自动为您执行错误处理和其他后台处理,类似于您的两个标志,但更有条理和更有效。