2013-10-09 28 views
1

同步調用我有下面的代碼片段:如何在Node.js的

var array = [1, 2, 3]; 
var data = 0; 
for(var i=0; i<array.length; i++){ 
    asyncFunction(data++); 
} 
console.log(data); 
executeOtherFunction(data); 

我期待數據的值3,但我認爲這是0,由於asyncFunction。當所有asyncFunction調用完成後,如何撥打executeOtherFunction

+1

這是你的實際代碼,還是試圖簡化它?實際上,在'console.log'行的'data'值是3,這正是你所期望的。 –

+0

已編輯。是的,這不是確切的代碼。我給出了一個簡化的邏輯,但這是它的確切流程。 – Gaurav

+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

我建議使用別名async.forEach,它與'async.each'完全相同,但更明顯的是它是forEach的異步版本 – Plato

+1

@Plato我甚至不知道它存在!從現在開始使用它,肯定會更有意義:) – robertklep

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