【发布时间】:2019-11-22 01:21:42
【问题描述】:
我在 MongoDB 中名为 X 和 Y 的两个表之间有一个 N:M 关系。两个表中都有记录。我需要更新这两个表之间的关系。我通过导入具有关系的文件来做到这一点。我需要按以下逻辑顺序同步执行此操作:
- 在 X 中查找记录以获取内部 id X-1
- 查找并更新 Y 中的记录以指向 X-1
- 更新 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!由于
findX是awaited,这应该保证在调用findAndUpdateY时它已经解决,所以解释和代码对我来说没有意义。此外,虽然提供minimal reproducible example 很好,但使用X和Y混淆问题可能会删除太多信息和上下文。请参阅what is the x-y problem(这是与您选择的名称无关的概念现象)。 -
如果你有一个操作映射,其中每个操作都依赖于前一个操作,你为什么要把它写成一个异步映射?
async函数同步运行直到它们遇到await,因此通过尝试使异步代码同步,您实际上已经使地图本身成为一个巨大的并行操作。 -
@ggorlen 谢谢,我会记住的。
-
@Mike'Pomax'Kamermans 谢谢,解决了。我将我的解决方案添加到原始问题中。我不知道我是如何考虑异步地图的。我确实尝试过不使用 async 关键字,但显然不能使用 await 关键字。虽然它现在有效,但我仍然不敢说我完全理解,但希望最终能实现
-
不要将您的解决方案编辑到您的问题中。 SO 是一个问答网站:将您的解决方案作为答案发布,然后接受。
标签: node.js promise async-await