【问题标题】:recursive retry function in nodejs [duplicate]nodejs中的递归重试功能[重复]
【发布时间】:2018-09-19 00:23:54
【问题描述】:

我是 nodejs 和 ES6 的新手,并试图理解 Promise。如果结果不可接受,我需要在特定时间间隔(在本例中为 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 条件,那么它不会在满足时将结果返回给调用者!任何人都可以帮助我了解正在发生的事情吗?

【问题讨论】:

标签: node.js promise settimeout


【解决方案1】:

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

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

【讨论】:

  • 谢谢。它使它变得非常简单。
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多