我问了有关如何在循环中运行异步方法的问题。我现在正在用类似递归的方式来做这件事。
How can asynchronous method in loop executed in sequence?
但是现在,如果第二次成功获取数据库数据,我无法将数据传递到最终回调(代码的最后一行)。
- 我注意到问题可能是:第二个 CallGetDB 解析()了我想要的数据,但第一个 CallGetDB 没有得到它。然后首先 CallGetDB 完成但没有解决任何问题。但不知道如何解决。
function CallGetDB(UID) {
return new Promise(function(resolve, reject){
GetDynamodb(UID)
.then((data)=> {
console.log("check before if"+JSON.stringify(data));
dbResponse = data;
resolve(dbResponse);
}
)
.catch((data)=> {
if(index++ < 2)
{
console.log("This is "+(index+1)+" try to get data from db with UID.");
setTimeout(function(){CallGetDB(UID);},100);
}
else
{
console.log("Database multi fetch failed");
resolve("Database multi fetch failed");
}
});
});
SendSQS(UID,event).then((data)=>{
return CallGetDB(data);
}).then((data)=>{
console.log("I am at most out:" +JSON.stringify(data));
response.body=JSON.stringify(data);
callback(null,response);
});
最佳答案
将 GetDynamodb(UID)
包装在 new Promise
中是一种反模式,因为它返回一个 Promise。
下面添加了一个 retries
参数,默认为 CallGetDB()
,并且在重试时在 catch()
中返回一个新的 Promise在限制内....或者抛出一个新的错误来捕获以下 catch()
let sleep = ms => new Promise(r => setTimeout(r, ms));
function CallGetDB(UID, retries = 0) {
return GetDynamodb(UID)
.catch((data) => {
if (retries++ < 2) {
console.log("This is " + (retries + 1) + " try to get data from db with UID.");
// return another promise
return sleep(100).then(() => CallGetDB(UID, retries));
} else {
console.log("Database multi fetch failed");
// throw error to next catch()
throw new Error("Database multi fetch failed");
}
});
}
SendSQS(UID, event).then((data) => {
return CallGetDB(data);
}).then((data) => {
console.log("Data Success:" + JSON.stringify(data));
response.body = JSON.stringify(data);
callback(null, data);
}).catch(err => /* do something when it all fails*/ );
关于javascript - 递归中的异步方法如何正确返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57066813/