2016-04-11 10 views
0

私はFacebookのグループIDの配列を同期順にチェックし、失敗した場合は次のものにスキップします。彼らがすべて実行を終えると、すべての結果をサーバーに送信したいと思います。

次のコードは、私が(もちろん、それは動作しません)達成するために何をしたいの要点を説明しています

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

私は待つためにループのための私を取得できますか?私は$q.all()を使用することができますが、私は約束を生成してpromise_arrayに保存する方法に固執しています。このコードはクライアントサイドにあり、私はAngularJS 1を使用していますが、私はどのアプローチにもオープンしています。 Mucho gracias!

すばやく角度で約束を生成する方法である

答えて

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

。今、あなたはまた、約束の配列を作成することができます。

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、で使用することができます配列の約束が解決されました。

+0

これをforループでどのように実行するのですか? forループで 'getGroupFeed'関数をラップするのと同じくらい簡単ですか? –

+2

これは同期していません。 – Avinash

+1

@ KangzeHuang、あなたはforループを使う必要はありません。このアプローチでは、promise_arrayを求めているものが得られます。これはforループより読みやすく、エラーの発生が少ないものです。 – Avinash

関連する問題