javascript - 递归中的异步方法如何正确返回结果?

标签 javascript asynchronous

我问了有关如何在循环中运行异步方法的问题。我现在正在用类似递归的方式来做这件事。

How can asynchronous method in loop executed in sequence?

但是现在,如果第二次成功获取数据库数据,我无法将数据传递到最终回调(代码的最后一行)。

  1. 我注意到问题可能是:第二个 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/

相关文章:

javascript - 如何使用 CSS 隐藏输入框

javascript - Paypal 中的 RESOURCE_NOT_FOUND

javascript - 异步加载一些生成的 Javascript

ios - Objective-C 中静态队列的异步日志记录

javascript - 如何从 FileReader() 输出值

javascript - NestJS 在非模块文件中注入(inject)模块服务

javascript - jQuery 以编程方式选择值 - 奇怪的问题

c# - 处理异步方法的取消

ruby-on-rails-3 - Rails 异步 POST 请求

python - 如何安排一个函数在 Flask 上每小时运行一次?