【问题标题】:Synchronous iteration not working in JavaScript同步迭代在 JavaScript 中不起作用
【发布时间】:2017-09-27 06:29:31
【问题描述】:

我正在尝试遍历一个数组并为每个被迭代者创建记录。这就是我正在做的事情,就像在另一个问题中提到的那样:

async.each(data, (datum, callback) => {
  console.log('Iterated')

  Datum.create({
    row: datum,
  }).exec((error) => {
    if (error) return res.serverError(error)
    console.log('Created')
    callback()
  })
})

不幸的是,结果如下:

Iterated
Iterated
Iterated
Created
Created
Created

这不是我们想要的:

Iterated
Created
Iterated
Created
Iterated
Created

我做错了什么?

【问题讨论】:

  • 试试async.eachSeries()
  • @Thomas 做到了 :) 请回答我的问题,以便我定价 :) 感谢大家的帮助!

标签: javascript sails.js waterline async.js


【解决方案1】:

async.eachSeries() 将一次运行一次迭代,并等待每次迭代终止,然后再进行下一步。

我在每次创建之前创建一个唯一的用户友好标识符(如 1、2、3 等)。为此,我必须查询数据库以找到最新的标识符并增加它,这是不可用的,因为记录几乎是同时创建的。

这听起来像是瓶颈。我不喜欢串行运行异步代码,因为这通常会减慢进程。这种方法怎么样:

  • 由于data,您知道需要多少标识符。
  • 在后端实现一个函数,该函数不会一次创建单个但n 这样的标识符(包括必要的递增等)并将该数组返回到前​​端。现在,您可以使用/映射预先计算的 ID 数组到数据数组来并行运行常规请求。

这应该会将运行时间从(createAnId + request) * data.length 减少到几乎是单次迭代的运行时间。由于所有这些请求都可以并行运行,因此大多是重叠的。

【讨论】:

    【解决方案2】:

    看起来 Datum.create 是一个异步函数。 forEach 遍历数组的三个元素中的每一个,依次记录它们。并且由于 JavaScript 在异步事件返回之前不会阻塞,因此您将依次获取每个 console.logs。 然后在 一些 时间后,结果进来,“创建”记录到控制台。

    【讨论】:

    • 你说得对,Datum 是 Sails.js 的异步函数。
    • 你熟悉 Promise 吗?由于您无法控制何时(或是否)异步请求将返回,因此您可以将每个调用设置为承诺,并将下一个调用链接为“.then”
    • 你的意思是“JavaScript 在异步事件等待被触发时不会阻塞”而不是“JavaScript 在异步事件正在处理时不会阻塞”,因为 javascript 不是“处理“什么?
    【解决方案3】:

    您似乎正在使用异步数据处理库。对于您想要得到的结果,您需要同步处理数据。你可以这样做:

    data.forEach(function(datum) {
      console.log('Iterated')
    
      Datum.create({
        row: datum,
      }).exec((error) => {
        if (error) return res.serverError(error)
        console.log('Created')
        callback()
      })
    })
    

    您现在可能还想完全删除 callback 函数,因为数据是同步处理的。

    【讨论】:

    • 谢谢您,尝试了您的解决方案,但没有成功。是的,Datum 是 Sails.js 提供的异步函数。
    • 这是有道理的。我假设 Datum.create 是一个同步操作。为什么需要同步流程?
    • 好问题。我在每次创建之前创建一个唯一的用户友好标识符(如 1、2、3 等)。为此,我必须查询数据库以找到最新的标识符并增加它,这是不可用的,因为记录几乎是同时创建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多