为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2021-04-28 08:30:12
我有一个执行承诺并等待响应的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' }
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

需要说明的几点:

  • 一个承诺只能解决一次。

  • 传递给Promise构造函数的回调将立即执行,此后不再执行

解决方案:将const promise1 = ...定义移入循环。这样,您可以在每次迭代中创建一个新的Promise。


查看完整回答
反对 回复 2021-05-13
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信