javascript - 通过 JavaScript 中的事件控制流程代码

标签 javascript control-flow

[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/

相关文章:

javascript - 绘图应用程序 - 通过单击工具更改光标

javascript - 我应该在 Github 上关注哪些 Javascript 项目?

javascript - jQuery preventdefault on form submit 第二次出错

c++ - 在 C++ 中编译类的代码时,控制流的顺序是什么?

javascript - JS promise 未按预期解决

javascript - 更新模型时如何更新 hasMany 关联?

python - 在 2 个 elif block 之间执行语句

Java JFrame 和程序流程

swift - 替换 Swift 中的 goto 语句

javascript - Selenium IDE : executing a test within a test