我是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条件,则在满足条件时它不会将结果返回给调用方!有人可以帮助我了解发生了什么事吗?
答案 0 :(得分:1)
首先,避免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));
}
});
}