【问题标题】:How to wait for promise to get resolve and execute other lines of code after如何等待承诺得到解决并在之后执行其他代码行
【发布时间】:2021-06-28 23:16:11
【问题描述】:

我是 js 异步/等待的新手。我正在使用 $.each 实用程序,我发现即使在使用 await 之后,代码行也会以异步方式执行,所以我从 $.each -> for,这对我有用

【问题讨论】:

  • return the promise ... 即return fetch(url, { - 但是,使用 async/await 作为$.each 的回调与使用它.forEach 具有相同的陷阱... TLDR其中就是......不要那样做,使用常规的 for 循环(一直到你拥有的嵌套循环) - 请参阅stackoverflow.com/questions/37576685/…

标签: javascript jquery async-await fetch


【解决方案1】:

你有 await 嵌套在一些 $.each(ticketIds, async function 循环中,但是意识到这些 async 函数在遇到 await 时返回,返回一个承诺:循环将因此产生一个一组承诺并继续而不等待那些承诺。

最简单的解决方案之一是使用for 循环,以便所有await 表达式在外部async 函数的上下文中运行。

例如,改变这个:

$.each(rowGroups, function(serviceName, obj) {
    // ...
});

到这里:

for (let [serviceName, obj] of Object.entries(rowGroups)) {
    // ...
}

...对所有嵌套循环执行此操作。

我认为有一个实例,其中迭代不是在 plain 对象上,而是在 array 上,所以从这个改变:

$.each(issueLinks, function(index, issue) {

到这里:

for (let [index, issue] of issueLinks.entries()) {

这解决了您的问题。但正如 cmets 中所述,您还有另一个问题:createJiraResponse 将保持未定义,因为您的 client 函数不会返回承诺。因此,要么从该箭头函数中删除大括号,要么将 fetch( 更改为 return fetch(

【讨论】:

  • 当然,const client 也应该返回一个承诺
  • 感谢您的回复,我正在尝试这个 rn,但是当 const client 返回一个承诺时。我需要确保在使用payload 执行作为 POST 请求的最后一行代码之前解决所有承诺
  • @hitendra,这确实是用for 循环替换所有$.each 循环的目的。那么最后一行只有在所有等待的 promise 都解决后才会执行。
  • 然后 Jaromanda 的评论也是正确的:client 目前没有返回任何东西,所以你必须以任何方式解决这个问题(在我的回答中添加了一段关于此的内容)。
猜你喜欢
  • 2020-06-20
  • 2020-10-17
  • 2022-11-21
  • 2021-02-02
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2020-04-12
相关资源
最近更新 更多