【问题标题】:How to use async / await when I need it embedded in a forEach() in javascript当我需要将 async/await 嵌入到 javascript 中的 forEach() 中时如何使用它
【发布时间】:2019-05-07 15:44:41
【问题描述】:

我知道这不会像我写的那样起作用,而且我没有看到任何可以为我解决问题的答案。代码太长,无法放在这里,但我已经包含了一个要点的链接

https://gist.github.com/dhawkinson/41211d067ea91e0b7a5823067d2e39fe

我的问题是这样的:

我得到一个 json 文件的 id 列表,这些文件必须被读取并转换为多个 SQL 表中的行。该列表来自另一个 json 文件,以 id 数组的形式到我需要读取和转换的文件。

根据要求,SQL 表中不能有包含冗余数据的行。 SQL 的 ID 是自动生成的。 API 中有 3 类实体:

  1. 学习者 -- 参加课程的学生
  2. 课程 -- 为学习者提供培训机会(他们有孩子代表细节)
  3. 成果 -- 学习者在特定日期参加课程的交集(他们的孩子代表详细信息)

学习者和课程都可能在结果中出现多次,但在特定日期仅出现一次。但是,Learners 和 Course 只能分别在 Learners 和 Courses 表中出现一次(没有冗余)。

我的源数据是 4 个 json 结果,与我列表中的 4 个 id 匹配。高级视图如下(格式:Course_TimeStamp.json)

  • id = 5sM5YLnnNMN_1525523468000.json(学习者 = daffy@duck.com)
  • id = 5sM5YLnnNMN_1527517868000.json(学习者 = yogi@bear.com)
  • id = 6tN6ZMooONO_1530730049000.json(学习者 = daffy@duck.com)
  • id = 6tN6ZMooONO_1541011649000.json(学习者 = foghorn@leghorn.com)

当我解析和写入我得到的数据时:

  • 3 行学习者(如预期)
  • 3 课程行(1 是多余的,不允许)
  • 4 个结果行(如预期)
  • 课程和成果的孩子正在按预期编写。

鉴于我的限制,我该如何解决这个问题?我怀疑冗余问题可能会在一些模糊的情况下出现在学习者表中,尽管它还没有出现。我对所有表格都使用相同的方法。

感谢您的帮助。对不起,冗长。

【问题讨论】:

  • 问题描述没有提到async或await,所以不清楚标题与问题的关系
  • 我在代码中使用 async / await ,如果你看一下要点就会看到。
  • 请在问题中发布您的代码的Minimal, Complete, and Verifiable example。不要依赖外部主机。
  • 这个要点超过 250 行。您至少必须解释要点的哪一部分与标题相关,并指出给您带来麻烦的行号。

标签: json promise async-await sequelize.js


【解决方案1】:

您不能将 async/await 与 forEach 一起使用

原因: 因为我们不能在同步函数中使用 await。如您所见,“processArray”是异步函数。但匿名 我们用于 forEach 的函数是同步的。 DO READ

questions.forEach((question) => {
    processCourseDetails(jsonData, question);
});

你可以使用简单的for循环,像这样

for(question of questions) {
    await processCourseDetails(jsonData, question);
}

你可以创建一个自定义函数来像 forEach 一样使用 async/await , DO READ

【讨论】:

  • 谢谢。我遇到了很多文章,但不是这一篇。我已经为它添加了书签,并将在早上深入研究它。希望这样做。
  • @doug5solas ,好的:)
  • 或者,您可以收集所有的承诺,然后Promise.all 他们。这让 Promise 可以并行运行。 await Promise.all(questions.map(q => processCourseDetails(jsonData, q)).
  • @Vivek Doshi:非常感谢。我已经为此苦苦挣扎了一段时间。我阅读了这篇文章并根据我的情况调整了这些示例,并且效果很好。我的所有结果都符合预期。我是一个感恩的菜鸟。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多