1

我有以下代码片段:

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电话都打完后怎么打?

4

3 回答 3

2

使用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) 和一个回调)

于 2013-10-09T13:44:38.047 回答
2

如果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);
}
于 2013-10-10T00:27:32.473 回答
1

看看这个模块,我认为这就是你要找的:

https://github.com/caolan/async

于 2013-10-09T13:43:38.480 回答