【问题标题】:Async's each immediately prints out all elements异步的 each 立即打印出所有元素
【发布时间】:2014-11-19 13:03:45
【问题描述】:

所以,我有一个包含三个对象的数组。它们具有名称和类型属性(以及其他各种属性)。我想遍历它们中的每一个并使用readline 模块来获取所有这些的用户输入。这是我用来执行此操作的 javascript 代码(使用 async 模块):

async.each(questions.q, function (e, cb) {
  if (e.type === "s") {
    //not important
  } else if (e.type === "q") {
    rl.question(e.name, function (a) {
      //do stuff
      cb();
    });
  }
}, function (err) {
  if (err) throw err;
});

question.q 是元素数组)

但是,我所有三个带有type q 的对象的输出如下:

Question1Question2Question3 //input

each 不是一次执行一个,而是将所有 3 个打印出来,然后等待输入。为什么会这样,我该如何解决?

【问题讨论】:

  • 如果你不想要这种行为,听起来你不应该异步运行这些,但我想如果你想使用 async 保持代码,你可以很容易地用编号变量模拟锁定机制.
  • @ShaneQful 我认为异步运行这些是正确的做法吗?它会等到工作完成后再继续下一个,对吗?
  • 所以你想让他们一次运行一个?尝试每个系列
  • @kyr 没有一次运行一个并继续下一个是同步行为。使用异步行为,它们同时运行并且无法保证顺序。
  • @aembke 这行得通!我很惊讶我以前没有看到。

标签: javascript node.js loops asynchronous foreach


【解决方案1】:

您可以使用async.eachSeries() 而不是async.each() 来解决此问题。 async.each() 并行迭代集合(您可以使用async.eachLimit() 限制并发),而async.eachSeries() 串行迭代集合(一次一个)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多