如何在Node.js中同步调用

时间:2013-10-09 13:37:31

标签: node.js asynchronous iife

我有以下代码段:

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,我将其视为0。所有executeOtherFunction来电完成后如何致电asyncFunction

3 个答案:

答案 0 :(得分: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)和一个回调)

答案 1 :(得分:2)

如果asyncFunction的实施方式如下:

function asyncFunction(n) {
    process.nextTick(function() { /* do some operations */ });
}

然后你无法知道asyncFunction何时实际执行,因为它离开了callstack。所以它需要在执行完成时通知。

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);
}

答案 2 :(得分:1)

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

https://github.com/caolan/async