javascript - 为什么我的do..while循环无法在async-await代码内正确执行setTimeout?

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

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

目的是在do..while循环的“ do”语句中的函数respo = await promise1.then(resp => resp)仅在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构造函数的回调将立即执行,此后不再执行


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

关于javascript - 为什么我的do..while循环无法在async-await代码内正确执行setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855243/

相关文章:

javascript - 无法插值传递$ scope变量到 Angular 滤波器的错误

javascript - 合并javascript-悬停导航以显示内容

javascript - RegEx禁止字符,除非已转义

javascript - axios promise 如何定义错误

c# - 我应该指定什么作为 ForEachAsync 扩展方法的 Dop 参数?

javascript - jQuery动画的宽度和高度设置

mysql - Knex创建数据库并向其中插入数据

javascript - 如何找到等待 promise 的 JavaScript 代码

.net-3.5 - 异步/等待紧凑框架 v3.5 - 手动实现

c# - 这是使用 System.Threading.Timer 运行计划的异步/等待方法的正确方法吗?