2016-04-11 8 views
0

Ich habe eine Reihe von Facebook Gruppen-IDs, die ich in synchroner Reihenfolge einchecken möchte, und wenn eine fehlschlägt, um zum nächsten zu springen. Wenn alle fertig sind, möchte ich alle Ergebnisse an meinen Server senden.

Der Code unten erklärt den Kern von dem, was ich erreichen will (natürlich funktioniert es nicht):

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(); 

Wie kann ich meine for-Schleife erhalten zu warten? Ich weiß, dass ich $q.all() verwenden kann, aber ich bin fest, wie man die Versprechen generiert und sie zu einem promise_array speichern. Dieser Code ist auf der Client-Seite und ich benutze AngularJS 1, aber ich bin offen für jeden Ansatz. Mucho Gracias!

Antwort

3
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; 
} 

So können Sie schnell ein Versprechen in Angular generieren. Jetzt können Sie auch eine Reihe von Versprechungen erstellen:

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

Oder wenn Sie auf einer for-Schleife bestehen:

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

Diese Reihe von Versprechungen können dann in $q.all verwendet werden, die nur einmal alle gelöst Versprechen im Array sind gelöst.

+0

Wie würde ich dies in einer for-Schleife ausführen lassen? Ist es so einfach, die 'getGroupFeed' -Funktion in eine for-Schleife zu bringen? –

+2

Dies ist immer noch nicht synchron. – Avinash

+1

@KangzeHuang, Sie müssen keine for-Schleife verwenden. Dieser Ansatz liefert Ihnen, was Sie für promise_array fragen, und es ist lesbarer und weniger fehleranfällig als for-Schleife. – Avinash