nodejs中的递归重试功能
recursive retry function in nodejs
我是 nodejs 和 ES6 的新手,正在努力理解 promises。如果结果不可接受,我需要在特定时间间隔(在本例中为 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
已经 return 一个 Promise
,所以没有必要再构造一个。然后,在 if(result.length !== 100){
中,您需要能够将 retryFunc
的递归调用链接在一起;你不能直接从(异步,基于回调的)setTimeout
return
,就像你当前的代码一样。
一个选择是创建一个 delay
函数,它 return 是一个 Promise
在所需的时间后解析 - 然后,您可以使用 return delay(5000).then(() => retryFunc(ddbParams, numberOfRetry - 1))
return 递归调用。
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));
}
});
}
我是 nodejs 和 ES6 的新手,正在努力理解 promises。如果结果不可接受,我需要在特定时间间隔(在本例中为 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
已经 return 一个 Promise
,所以没有必要再构造一个。然后,在 if(result.length !== 100){
中,您需要能够将 retryFunc
的递归调用链接在一起;你不能直接从(异步,基于回调的)setTimeout
return
,就像你当前的代码一样。
一个选择是创建一个 delay
函数,它 return 是一个 Promise
在所需的时间后解析 - 然后,您可以使用 return delay(5000).then(() => retryFunc(ddbParams, numberOfRetry - 1))
return 递归调用。
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));
}
});
}