不,這是一個完全不同的問題(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!");
});
[Node.js:執行多個異步操作的最佳方式,然後執行其他操作?]的可能重複(http://stackoverflow.com/questions/26268651/node-js-best-way-to-perform-multiple -async-operations-then-do-something-else) – naomik
是你的client.on在客戶端實現的嗎?或者這是一個回調,告訴你它已經發送給客戶端? – Tim