Node.js中的递归重试函数

时间:2018-09-19 00:23:54

标签: node.js promise settimeout

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

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条件,则在满足条件时它不会将结果返回给调用方!有人可以帮助我了解发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

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

一个选择是创建一个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));
    }
  });
}