如何使用 $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
中使用这个承诺数组,只有在解决数组中的所有承诺后才会解决。
我有一组 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
中使用这个承诺数组,只有在解决数组中的所有承诺后才会解决。