gpt4 book ai didi

node.js - Nodejs中的递归重试功能

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:28 25 4
gpt4 key购买 nike

我是 Nodejs 和 ES6 的新手,并试图理解 Promise。如果结果 Not Acceptable ,我需要在特定时间间隔(本例中为 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 条件,那么当它满足时,它不会将结果返回给调用者!谁能帮我理解发生了什么?

最佳答案

首先,避免 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));
}
});
}

关于node.js - Nodejs中的递归重试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com