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 - JavaScript中的drawtriangles函数

javascript - 使用promise语法编写同步代码有什么好处?

javascript - 处理另一个函数调用的异步函数时出现问题

c# - Winforms调用异步方法挂起程序

javascript - 在Javascript中将任意字符串转换为0到1之间的数字

javascript - 我如何使用事件处理程序连续循环遍历数组列表(从末尾返回到开始)

javascript - jQuery树形图

javascript - 如何在Javascript / Node中的异步函数上调用Await后超时

javascript - 重型Node.js应用程序上的节点持久性未返回值

c# - “透明地”向异步方法添加同步缓存机制