Проблема с переменными при использовании асинхронных вызовов FB.api с jQuery.when() [закрыто]

Попытка получить данные из нескольких вызовов FB в один массив и работать с ним по мере готовности. К сожалению. Скрипт ждет ответа, но я никак не могу получить к нему доступ в дальнейшем.

    var xxx = 0; // Counter to check
    var friendsRequest = []; // Array to catch all calls and execute the code when all responses are back
    var friends = ['...','...']; // array of friend id's

    for (var i = 0; i < friends.length; i++) {
        var friend = friends[i]; // Go through number of FB friends (doesn't matter)

        // Here we save all calls to wait for result
        friendsRequest[friend] = FB.api('/' + friend + '/picture?redirect=0&height=64&type=square&width=64', function(response) {
            xxx++; // Try to increment the counter
            console.log(xxx); // Works fine.
        });
    }

    // Execute the code when all data collected.
    // It executes correctly __after__ last FB.api() async call ends
    $.when(friendsRequest).then(function(){
        console.log(xxx); // But here we have always "0"
    });

Может $.when как-то не работает с несколькими вызовами FB.api()? Есть идеи, что не так?

0
задан 12 February 2015 в 01:20

1 ответ

Здесь существует несколько ошибок:

1) Массивы не должны быть выполнены с помощью итераций как это:

for(i in ['...','...'])

Когда Вы делаете это, i будет индекс в массив, не объект в массиве. И, это будет выполнять итерации через свойства объекта, который может когда-то быть больше, чем просто элементы массива. Необходимо выполнить итерации элементов массива с также:

for (var i = 0; i < array.length; i++) {
    // process array[i]
}

или с .forEach():

array.forEach(function(item, index) {
    // process item here
});

2) Я не знаю API FB сам, но я не вижу документации это FB.api() возвращает обещание. $.when() только работы с обещаниями.

3) Когда Вы накапливаете объекты в friendsRequest, Вы создаете объект, не массив. Принятие friend.id строка, friendsRequest[friend.id] устанавливает свойство объекта, не элемент массива.

4) Если Вы хотите использовать фактический массив с $.when() (после фиксации других вещей на самом деле иметь массив) $.when() ожидает быть названным как это:

$.when(p1, p2, p3, p4)

где p1... p4 являются обещаниями. Так, если у Вас есть массив обещаний, затем можно звонить $.when() соответствующим способом путем выполнения этого:

$.when.apply($, arrayOfPromises)
1
ответ дан 6 October 2019 в 01:45

Другие вопросы по тегам:

Похожие вопросы: