如何在for循环中组织承诺,并在javascript函数之间传递参数

How to organise promises in for loop and pass argument between functions in javascript?

本文关键字:函数 javascript 并在 之间 参数 承诺 for 循环      更新时间:2023-09-26

我正试图在javascript中实现我的第一个承诺。我有这些函数。每一个功能必须完成才能进入下一步:

F1 --> get Current User Id
       and save it to var "MyUserID"
F2 --> getUserEvent (example 10 events)
       Go to a for loop for each event
       and for each iteration save value to var "EventId" 
           F3--> Get info for that specific event from facebook
           This function has 2 parameters (MyUserID,EventId)
           F4--> Get image for that specific event
           This function has 1 parameter (EventId)
           f5--> Save info to DB
           Go back to the loop

要实现这一点,我已经做了以下,但我知道它不工作。如果有任何有承诺经验的人可以为我展示原型,我真的很感激。我不确定如何在函数之间传递参数:

var getMyID = function() {
    return new Promise(function(resolve, reject) {
        // Get my id from facebook
        FB.api('/me', function(response) {
            if (response && !response.error) {
                console.log("response==   "+ JSON.stringify(response));
                retuen(response.id);//MyUserId
            }
        });
    });
};
getMyID.then(function(myID) {
    FB.api('/me/events', function(response) {
        console.log("response==   "+ JSON.stringify(response));    
        for(i=0; i<response.data.length;i++) {
            console.log("eventID=  "+response.data[i].id);
            getEvent(response.data[i].id,myID);
        }
    });
}).catch(function(error) {
    console.log('oh no', error);
}).then(function(eventID,myID) {
     FB.api("/"+ eventID , function (response3) {
            if (response3 && !response3.error) {
                //....
                if(myID == response3.owner.id && diff < 0 )
                {
                    //save to DB -- Another place I need to add promise
                }
            }
        });
});

我看到了以下bug:

  • getMyID返回的promise永远不会被解析或拒绝。
  • getMyID.then不起作用,因为getMyIDFunction,而不是Promise。也许你指的是getMyID().then(...)
  • 调用/me/events的回调应该返回一个Promise,这样它是异步的。目前,它将启动对Facebook API的调用,然后立即转到下一个then处理器。
  • 与最终的then处理器相同。
  • 你应该把catch放在最后,这样它就能捕获所有的错误。
  • 输入错误,retuen代替return

为了DRY,我建议您围绕Facebook API创建一个承诺返回包装器。像这样:

function fbAPIRequest(url) {
  return new Promise(function (resolve, reject) {
    FB.api(url, function(response) {
      if (response && !response.error) {
        resolve(response);
      } else {
        reject(response);
      }
    });
  };
}

这将使你的代码更简单:

var myUserID;
fbAPIRequest('/me')
  .then(function (response) {
    myUserID = response.id;
    return fbAPIRequest('/me/events');
  })
  .then(function (response) {
    var eventPromises = response.data.map(function (data) {
      return getEvent(data.id, myUserID);
    });
    return Promise.all(eventPromises);
  })
  .catch(function(error) {
    console.log('oh no', error);
  });
function getEvent(eventID, userID) {
  return fbAPIRequest('/' + eventID)
    .then(function (response) {
      if (response.owner.id === userID && diff < 0) {
        return saveToDB(response);
      }
    });
}
function saveToDB(event) {
  return new Promise(...);
}

您会注意到,我通过返回值(这将成为链中的下一个回调所消耗的值)、返回将解析为值的承诺或利用闭包(如设置myUserID变量)在回调之间传递数据。