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 - 等待可观察的订阅 Angelar2

javascript - Jquery click 不适用于通过 PHP 动态添加的表 tr

javascript - 未处理的 JavaScript 异常终止 MSAppHost/WWAHost.exe

error-handling - rxjs-最终处理异步错误

javascript - 如何使用 Promise.all 并以对象作为输入

c# - 用于 UDP 服务器的 C# 可等待 SocketAsyncEventArgs 包装器; socket.ReceiveAsync 返回无效的 RemoteEndPoint (0.0.0.0 :0)

php - jQuery POST 值到 PHP 脚本

javascript - Node.js:使用 Bluebird 将模块函数从回调转换为 Promise

c# - 等待异步方法而不阻塞线程

c# - 将 SynchronizationContext 设置为 null 而不是使用 ConfigureAwait(false)