我有以下代码片段:
var array = [1, 2, 3];
var data = 0;
for(var i=0; i<array.length; i++){
asyncFunction(data++);
}
console.log(data);
executeOtherFunction(data);
我期望数据的值为 3,但由于asyncFunction
. executeOtherFunction
所有asyncFunction
电话都打完后怎么打?
我有以下代码片段:
var array = [1, 2, 3];
var data = 0;
for(var i=0; i<array.length; i++){
asyncFunction(data++);
}
console.log(data);
executeOtherFunction(data);
我期望数据的值为 3,但由于asyncFunction
. executeOtherFunction
所有asyncFunction
电话都打完后怎么打?
使用async.each
:
var async = require('async');
var data = 0;
var array = [ 1, 2, 3 ];
async.each(array, function(item, done) {
asyncFunction(data++, done);
}, function(err) {
if (err) ... // handle error
console.log(data);
executeOtherFunction(data);
});
(假设asyncFunction
需要两个参数,一个数字 ( data
) 和一个回调)
如果asyncFunction
实现如下:
function asyncFunction(n) {
process.nextTick(function() { /* do some operations */ });
}
然后您将无法知道何时asyncFunction
实际执行完毕,因为它已离开调用堆栈。所以它需要在执行完成时通知。
function asyncFunction(n, callback) {
process.nextTick(function() {
/* do some operations */
callback();
});
}
这是使用简单的回调机制。如果您想使用异常多的模块之一来为您处理此问题,请继续。但是使用基本回调实现类似的东西可能并不漂亮,但并不困难。
var array = [1, 2, 3];
var data = 0;
var cntr = 0;
function countnExecute() {
if (++cntr === array.length)
executeOtherFunction(data);
}
for(var i = 0; i < array.length; i++){
asyncFunction(data++, countnExecute);
}
看看这个模块,我认为这就是你要找的: