node.js - nodejs中的递归重试功能
问题描述
我是 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 条件,那么它不会在满足时将结果返回给调用者!任何人都可以帮助我了解正在发生的事情吗?
解决方案
首先,避免显式的 promise 构造反模式——.query
已经返回 a Promise
,所以没有必要构造另一个。然后,你在你的内部if(result.length !== 100){
,你需要能够将递归调用链接在一起retryFunc
;您不能直接return
从 (asynchronous, callback-based) setTimeout
,就像您当前的代码一样。
一种选择是创建一个delay
函数,该函数返回Promise
在所需时间后解析的 a - 然后,您可以使用它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));
}
});
}
推荐阅读
- angular - 从模板调用组件时,Angular / 将数据发送到组件
- java - 查找字符串数组中最长和最短的字符串
- kotlin - 从场景形式场景中隐藏 arObject
- c++ - (C++) 用于评估返回不正确值的简单算术表达式的解析树
- vue.js - 嵌套数组 Vue 中的总计
- python - 如何在soup.find_all中打印“未找到”?
- python - 将数据保存在 JSON 文件中
- discord - Discord Bot (JDA) 没有修改我的角色
- javascript - 使用 jshjohnson 选项按文本选择项目
- powerbi - Power BI:如何更改矩阵中特定行的背景颜色?