nodejs中的递归重试函数[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我是nodejs和ES6的新手,并试图了解承诺。如果结果不可接受,我需要在特定的时间间隔内重试一个dynamodb查询函数(在这种情况下为5秒)!所以我有这样的功能:

const retryFunc = (ddbParams, numberOfRetry) => {
return new Promise((resolve, reject) => {
  return DDBUtils.query(ddbParams).then(result => {
    //need to return a specific number of rows from the ddb table
    if(numberOfRetry > 0){
      if(result.length !== 100){
        numberOfRetry = numberOfRetry - 1
        setTimeout(() => {
          retryFunc(ddbParams, numberOfRetry)
        }, 5000)
      }
    }
    resolve(result)
  }).catch(error => {
    reject(error)
  })
})

}

当dynamodb查询在第一次调用中返回可接受的结果(100条记录)时,该函数正常工作并将结果返回给调用者。但是如果需要重试函数以满足100条件,那么当它满足时它不会将结果返回给调用者!谁能帮我理解发生了什么?

node.js promise settimeout
1个回答
1
投票

首先,避免explicit promise construction antipattern - .query已经返回Promise,因此不需要构建另一个。然后,你在你的if(result.length !== 100){内,你需要能够连接retryFunc的递归调用;你不能直接从(异步的,基于回调的)return setTimeout,就像你当前的代码一样。

一种选择是创建一个delay函数,它返回一个Promise,在所需的时间后解析 - 然后,你可以使用return delay(5000).then(() => retryFunc(ddbParams, numberOfRetry - 1))返回递归调用。

const delay = ms => new Promise(res => setTimeout(res, ms));
const retryFunc = (ddbParams, numberOfRetry) => {
  return DDBUtils.query(ddbParams).then(result => {
    if(numberOfRetry > 0 && result.length !== 100) {
      return delay(5000).then(() => retryFunc(ddbParams, numberOfRetry - 1));
    }
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.