2015-06-02 50 views
1
[1,2,3].map(function(num) { 
    client.fooBar(num); 
    // don't move on until `foo` is emitted to `client` 
}); 

client.on('foo', function(num) { 
    console.log(num) 
}); 

client.fooBar被調用時,異步調用由一個事件和一個事件foo控制流代碼被髮射上client。如果我只想一次處理一個數字(不要移至2,直至1已被處理),那麼組織我的代碼的最佳方式是什麼?這是node.js。通過在javascript

+0

[Node.js:執行多個異步操作的最佳方式,然後執行其他操作?]的可能重複(http://stackoverflow.com/questions/26268651/node-js-best-way-to-perform-multiple -async-operations-then-do-something-else) – naomik

+0

是你的client.on在客戶端實現的嗎?或者這是一個回調,告訴你它已經發送給客戶端? – Tim

回答

1

不,這是一個完全不同的問題(switz)。

不,它並不完全不同。你有一系列需要一個異步(事件驅動)的控制結構。

因爲你fooBar功能觸發一個事件foo而不是採取一個回調,你需要一個foo事件監聽器連接到控制代碼通知循環時進行到陣列中的下一個元素。

除非有其他方式讓控制結構知道何時繼續,否則我沒有看到完成任務的另一種方式。

這使用async.eachSeries來實現自己的目標

async.eachSeries([1,2,3], function(num, done) { 
    client.once("foo", function() { done(); }); 
    client.fooBar(num); 
}, function(err) { 
    if (err) throw err; 
    console.log("all done!"); 
}); 

如果你不想依賴於async lib中,你可以編寫自己的asyncForEach功能

function asyncForEach(arr, iterator, callback) { 
    var queue = arr.slice(0); 
    function next(err) { 
    if (err) return callback(err); 
    if (queue.length === 0) return callback(null); 
    iterator(queue.shift(), next); 
    } 
    next(); 
} 

然後使用它在你的代碼

asyncForEach([1,2,3], function(num, done) { 
    client.once("foo", function() { done(); }); 
    client.fooBar(num); 
}, function(err) { 
    if (err) throw err; 
    console.log("all done!"); 
});