【问题标题】:Multiple await when iterating an array in NodeJS在NodeJS中迭代数组时多次等待
【发布时间】:2019-11-22 01:21:42
【问题描述】:

我在 MongoDB 中名为 X 和 Y 的两个表之间有一个 N:M 关系。两个表中都有记录。我需要更新这两个表之间的关系。我通过导入具有关系的文件来做到这一点。我需要按以下逻辑顺序同步执行此操作:

  1. 在 X 中查找记录以获取内部 id X-1
  2. 查找并更新 Y 中的记录以指向 X-1
  3. 更新 X 中的记录以指向 Y1

三个操作会给我一个 X1 和 Y1 之间的 N:N 关系。

问题是当我遍历数组同步调用这三个操作时,它不起作用,因为循环的执行没有等待承诺。

这是我的伪代码:

let relations = JSON.parse(data);
productsRelations.map(async (relation) => {
  let x1 = await findX(x1); // find x1 based on info in file
  let y1 = await findAndUpdateY(y1, x1); // find and update y1 with relation to x1
  await updateX(x1, y1); // update x1 with relation to y1
});

结果是在调用findAndUpdateY 时,findX 尚未解析。我确信有一个简单的解决方案,希望有人能启发我。

【问题讨论】:

  • 欢迎来到 SO!由于findXawaited,这应该保证在调用findAndUpdateY 时它已经解决,所以解释和代码对我来说没有意义。此外,虽然提供minimal reproducible example 很好,但使用XY 混淆问题可能会删除太多信息和上下文。请参阅what is the x-y problem(这是与您选择的名称无关的概念现象)。
  • 如果你有一个操作映射,其中每个操作都依赖于前一个操作,你为什么要把它写成一个异步映射? async 函数同步运行直到它们遇到await,因此通过尝试使异步代码同步,您实际上已经使地图本身成为一个巨大的并行操作。
  • @ggorlen 谢谢,我会记住的。
  • @Mike'Pomax'Kamermans 谢谢,解决了。我将我的解决方案添加到原始问题中。我不知道我是如何考虑异步地图的。我确实尝试过不使用 async 关键字,但显然不能使用 await 关键字。虽然它现在有效,但我仍然不敢说我完全理解,但希望最终能实现
  • 不要将您的解决方案编辑到您的问题中。 SO 是一个问答网站:将您的解决方案作为答案发布,然后接受。

标签: node.js promise async-await


【解决方案1】:

@Mike'Pomax'Kamermans 的回复确实是问题所在。我把它改成这样以获得预期的结果:

const updateRelations = async (relation) => {
  let x1 = await findX(x1);
  let y1 = await findAndUpdateY(y1, x1);
}
let relations = JSON.parse(data);
for (const relation of relations) {
  await updateRelations(relation);
}

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2012-10-13
    • 2019-08-26
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多