javascript - 为什么我的 do..while 循环不能正确执行异步等待代码中的 setTimeout?

原文 标签 javascript promise async-await do-while

我有一个执行 promise 并等待响应的 do..while 循环。当响应为“处理中”或“已接收”时,循环需要继续。但是,Promise 中有一个 setTimeout 函数。

这里的目标是函数 respo = await promise1.then(resp => resp) ,在 do..while 循环的“do”语句中,仅在 2 秒后被调用。这只是为了让我正在使用的 API 完成它的工作。

当前发生的是 setTimeout 被调用一次,并且循环几乎立即重复相同的响应,表明 2 秒的中断不起作用。

我究竟做错了什么?

const promise1 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(tasks(resStatus.data.task.id, tokenTenant))
  }, 2000);
})

do {
  respo = await promise1
  console.log(respo.data)
} while (respo.data.status === "Processing" || respo.data.status === "Received");

.
.
.

对于那些古玩的人的一些示例响应(问题已解决):
ALL SYSTEMS GO!
{ id: 'd23b2cf3-02c3-48fe-9479-1407238d41d9',
  status: 'Received',
  result: null,
  tenant_id: 'eaa55f40-93fa',
  creation_time: '2019-04-25T18:19:47+0000' }

****...some results omitted for brievety...****

{ id: 'd23b2cf3-02c3-48fe-9479-1407238d41d9',
  status: 'Processing',
  result: null,
  tenant_id: 'eaa55f40-93fa',
  creation_time: '2019-04-25T18:19:47+0000' }
{ id: 'd23b2cf3-02c3-48fe-9479-1407238d41d9',
  status: 'Failed',
  result: { Reason: '[Errno 22] Invalid argument' },
  tenant_id: 'eaa55f40-93fa',
  creation_time: '2019-04-25T18:19:47+0000' }

最佳答案

需要说明几点:

  • 一个 promise 只能解决一次。
  • 传递给 Promise 的回调构造函数立即执行,之后不再执行

  • 解决方法:移动const promise1 = ...循环内的定义。这样你每次迭代都会创建一个新的 Promise。

    关于javascript - 为什么我的 do..while 循环不能正确执行异步等待代码中的 setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855243/

    相关文章:

    javascript - 构建复选框过滤器以基于多个 data-* 属性显示/隐藏元素的最佳方法

    javascript - 为什么这些 .then() 出现乱序?

    javascript - 等待异步功能

    javascript - 运行 1000 个请求,以便一次只运行 10 个

    javascript - 使用 map/reduce 和 jQuery 顺序运行任意数量的脚本

    node.js - 如何在 Mongoose 中使用异步/等待

    javascript - 在 React-Native 的非异步函数中调用异步函数 - Firebase

    javascript - 创建两个日期之间的日期数组

    c# - 使用DRY和分而治之原理链接异步方法

    javascript - 根据某些元素是否在其中隐藏 div