这个问题在这里已有答案:
我是nodejs和ES6的新手,并试图了解承诺。如果结果不可接受,我需要在特定的时间间隔内重试一个dynamodb查询函数(在这种情况下为5秒)!所以我有这样的功能:
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));
}
});
}