[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
时,会进行异步调用,并在 client
上发出事件 foo
。如果我只想一次处理一个数字(在处理 1
之前不要移至 2
),组织代码的最佳方法是什么?这是node.js。
最佳答案
No. That's an entirely different question (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
库,您可以编写自己的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!");
});
关于javascript - 通过 JavaScript 中的事件控制流程代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30587238/