循环等待承诺的问题

时间:2020-03-27 07:19:40

标签: javascript node.js typescript promise async-await

我已经为一个API调用实现了重试逻辑,如下所示:

private async fetchRecordingStatus(user: User): Promise<RecordingStatus[]> {
        const rs: RecordingStatus[] = [];
        let noOfRetries = 10;
        while (noOfRetries >= 0) {
            try {
                const userLineRecordingStatus = await this.getUserRecordingStatus(user.userid);
                 this.logger.log(`Preparing recording config status of userid:  ${hrUser.userid}`);

              // some processing  
                break;
            } catch (err) {
                if (noOfRetries === 0) {
                    throw err;
                } else {
                    this.logger.log(`Retry preparing recording config status of user: ${user.userid}`);
                    noOfRetries -= 1;
                    // wait for 2 seconds before trying
                    await new Promise(r => setTimeout(r, 2000));
                }
            }
        }
        return rs;
 }

在上面的代码中,我从客户端代码中调用 fetchRecordingStatus 方法(一个循环中大约有10,000个用户)。但是由于某种原因,当API调用(getUserRecordingStatus)失败时,流程似乎挂起,而不是重试逻辑。在日志中,我可以看到一次打印了retry语句,仅此而已。有什么想念的东西吗?感谢您的帮助。

演示:

async function fetchRecordingStatus(user) {
  const rs = [];
  let noOfRetries = 5;
  while (noOfRetries >= 0) {
    try {
      const userLineRecordingStatus = await Promise.reject(new Error('fail'));
      console.log(`Preparing recording config status of userid:`);

      // some processing  
      break;
    } catch (err) {
      if (noOfRetries === 0) {
        throw err;
      } else {
        console.log(`Retry preparing recording config status of user: `);
        noOfRetries -= 1;
        // wait for 2 seconds before trying
        await new Promise(r => setTimeout(r, 2000));
      }
    }
  }
  return rs;
}
fetchRecordingStatus()

0 个答案:

没有答案