2016-04-11 2 views
0

У меня есть массив идентификаторов группы Facebook, которые я хочу проверить в синхронном порядке, а если один не удается, перейдите к следующему. Когда они закончат выполнение, я хочу отправить все результаты на свой сервер.

Код ниже объясняет суть того, что я хочу сделать (конечно, это не работает):

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

Или, если вы настаиваете на цикл:

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

Этот массив обещаний затем может быть использована в $q.all, которая только решена раз все обещания в массиве разрешены.

+0

Как мне заставить это выполнить в цикле for? Это так же просто, как обертывание функции getGroupFeed в цикле for? –

+2

Еще это не синхронно. – Avinash

+1

@ KangzeHuang, вам не нужно использовать для цикла. Этот подход дает вам то, что вы запрашиваете для prom_array, и оно более читаемо и меньше подвержено ошибкам, чем для цикла. – Avinash

Смежные вопросы