如何使用 $q promises 同步执行 FOR LOOP?

How to synchronously execute FOR LOOP using $q promises?

我有一组 Facebook groupID,我想按同步顺序检查它们,如果一个失败,则跳到下一个。当它们都执行完后,我想将所有结果发送到我的服务器。

下面的代码解释了我想要完成的要点(当然它不起作用):

var groups = [1111,2222,3333];
var feed_collection = [];

// Unfortunately this for loop does not wait for the FB api calls to finish before looping to next
for(var x = 0; x < groups.length; x++){
   FB.api("/"+groups[x]+"/feed", function(response, err){
      feed_collection += response;
   });
}
// Send the feed_collection to server
feed_collection.sendToServer();

如何让 for 循环等待?我知道我可以使用 $q.all(),但是我一直在研究如何生成承诺并将它们保存到 promise_array。此代码位于客户端,我使用的是 AngularJS 1,但我对任何方法都持开放态度。非常感谢!

function getGroupFeed(groupId) {
  var deferred = $q.defer();
  FB.api('/' + groupId + '/feed', function (response, err) {
    if (err) return deferred.reject(err);
    return deferred.resolve(response);
  });
  return deferred.promise;
}

这就是您如何在 Angular 中快速生成承诺。现在您还可以创建一个承诺数组:

var groupPromises = groups.map(function (groupId) {
  return getGroupFeed(groupId);
});

或者如果您坚持使用 for 循环:

var groupPromises = [];
for (var i = 0, len = groups.length; i < len; i++) {
  groupPromises.push(getGroupFeed(group[i]));
}

然后可以在 $q.all 中使用这个承诺数组,只有在解决数组中的所有承诺后才会解决。