【问题标题】:Async/await with multiple for loops带有多个 for 循环的异步/等待
【发布时间】:2021-12-24 08:25:21
【问题描述】:

我很难理解 aysnc/await 如何适用于我的特定场景。我有一些 for 循环,我想彼此并行运行,但我还有其他 for 循环依赖于从并行 for 循环之一创建的数据。

Loop 1 {
/* Delete some rows from a SQL Table */
}

Loop 2 {
/* Delete some rows from a SQL Table */
}

Loop 3 {
/* Add some rows to a SQL Table */
}

Loop 4 {
/* Update some rows from a SQL Table */
}

我想要发生的是循环 1、循环 2 和循环 3 并行运行而不是顺序运行。在 Loop 3 完成之前,我不希望 Loop 4 运行。如何通过 async/await 实现这一点。我正在尝试改进此代码的运行时间,但我需要使用 for 循环来遍历数据库中的数据。

或者,如果有一种方法可以使用不同的方法而不是 for 循环来降低时间复杂度,我愿意接受建议。

【问题讨论】:

标签: javascript asynchronous async-await promise runtime


【解决方案1】:

等待 Promise.all(promiseLoop1, promiseLoop2, promiseLoop3);

等待 promiseLoop4;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

编辑:

此外,您可以使用循环构建 SQL 命令字符串,但只调用一次 SQL。

您可能还想查看 SQL 事务:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver15

【讨论】:

  • 我已经尝试过这种方法,但循环 1-3 仍然一个接一个地运行。我正在尝试并行运行它们。如果它们并行运行,这会降低我的代码的时间复杂度还是我想错了?
  • @jbowden97 如果您为每个循环创建一个新的 Promise,它们应该异步运行。如果您的循环相对较短,它们似乎只会同步运行。例如,要查看异步行为,请使用 setTimeouts。让承诺 1 在 10 秒后结算,承诺 2 在 5 秒后结算,承诺 3 在 1 秒后结算。 Promise 将按以下顺序解析:Promise 3、2、然后 1。
  • @jbowden97,请分享您在问题中的方法的代码。
  • 实际上,这种方法并不是 OP 想要的。 loop4 仍然需要等待 loop1loop2 完成甚至 loop3 提前完成。 loop4 应该只等待loop3
  • @ikhvjs OP 还询问是否“有办法使用不同的方法来降低时间复杂度”。由于 OP 实际上并不提供代码,因此只能推断循环 1-3 实际上是在进行单独的 SQL 调用。最好构建一个 SQL 命令字符串并进行一次调用。这仍然需要先完成循环 1-3,然后再将 SQL 命令字符串附加到循环 4,然后最终在一次调用中使用完整的命令调用 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多