Проблема зацикливания запросов в Facebook - PullRequest
1 голос
/ 09 марта 2012

У меня есть следующий код JavaScript, который получает все идентификаторы альбомов пользователя, который в данный момент вошел в систему:

function fqlQuery(){
            showLoader(true);
            var albums= new Array();
            FB.api('/me', function(response) {
                var query =  FB.Data.query('SELECT aid, owner, name, object_id FROM album WHERE owner={0}', response.id);
                var aantal_albums=0;        
                var photos= new Array();
                query.wait(function(rows) {
                aantal_albums= rows.length;     
                    for(var i=0; i<aantal_albums;i++){

                     albums[i]= rows[i].aid;
                    }
                 });
            });
            alert(albums[1]);       
        }

Моя проблема в последней строке, предупреждение не работает. Он вызывается вне функции, в которой массив заполнен, но это должно быть хорошо, потому что массив объявлен вверху (var album = new Array), верно? Я чувствую, что в комнате есть слон, и я не вижу его. Вы видите что-то не так? Я не знаю, если это проблема FQL или JavaScript.

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Это проблема JavaScript. В частности, это проблема с вашим пониманием асинхронных событий и обратных вызовов.

Если вы посмотрите на структуру вашей программы, станет ясно, что вы:

  1. var albums= new Array(); // creating an Array
  2. FB.api('/me', function() {}); // launching an API request
  3. alert(albums[1]); // accessing the second album

Однако не всегда ясно, что запрос API является асинхронным. Запрос API запускается при вызове FB.api(), но он не завершен сразу. Для этого и нужен второй параметр FB.api(); он позволяет вам указать функцию (то есть блок кода), выполнение которой задерживается до тех пор, пока запрос API не завершится через некоторое время .

Вы можете использовать результаты вызова API только в функции обратного вызова. Конечно, массив albums был объявлен; но пока он не будет заполнен обратным вызовом через некоторое время , его длина будет 0; и вы пытаетесь получить доступ ко 2-му элементу.

1 голос
/ 09 марта 2012

Вы не думаете асинхронно;массив не будет заполняться до тех пор, пока не будет выполнен обратный вызов, который вы передали FB.api, и ваш alert не выполнится до этого.

Поместите alert в вашу функцию обратного вызова, и вы должны получить результатывы ожидаете.

1 голос
/ 09 марта 2012

API является асинхронным. Вы не сможете увидеть результаты, пока они не станут доступны.

Если вы переместите оповещение на внутри функции ответа, как сразу после цикла for, все должно работать лучше.

...