2016-06-15 4 views
0

У меня есть функция в моем friendsService, которая возвращает массив объектов.Невозможно выполнить итерацию по полученным данным

getTopFriends: function() { 
var deferred = $q.defer(); 
var data = []; 
FB.api('/me/photos/uploaded', function(response) { 
    angular.forEach(response.data, function(key, value) { 
     FB.api('/' + key.id + '/tags', function(response) { 
      angular.forEach(response.data, function(key, value) { 
       var res = { 
        id: key.id, 
        name: key.name 
       } 
       FB.api('/' + key.id + '/picture?width=200&height=200', 'GET', function(response) { 
        res.url = response.data.url; 
        data.push(res); 
       }); 
      }); 
     }); 
    }); 
    deferred.resolve(data); 
}); 
return deferred.promise; 

}

Затем в мой контроллер, я использую его, как это:

friendsService.getTopFriends().then(function(data) { 
    console.log(data); 
}); 

И я получаю ответ, как это, которое следовало ожидать. enter image description here

Но если я попытаюсь перебрать эти данные с помощью angular.forEach(), я не получаю никаких результатов или ошибок в консоли. Как узнать, в чем проблема в моем коде и как я могу ее исправить?

+0

Получаете ли вы какие-либо ошибки js при переходе по итерации по данным? А также, пожалуйста, покажите точный код, который не работал. –

+0

попытайтесь получить доступ к любому конкретному полю из ответов json как данные [0] .field_name и посмотреть, отображается ли оно. Затем вы можете отследить, что становится неправильным в вашем цикле forEach. – MasterMohsin

+0

Похоже, ваш ответ не имеет поля данных. Вы должны попытаться выполнить итерацию ответа, а не 'response.data'. Надеюсь, что hepls –

ответ

0

Вы разрешаете обещание до того, как все вызовы, заполняющие массив, закончились.

Это означает, что data в следующем:

friendsService.getTopFriends().then(function(data) { 
    console.log(data); 
}); 

Будет пустой массив.

angular.forEach() не даст никаких ошибок, но ничего не сделает, поскольку нет элементов.

console.log работает немного иначе.

В верхней части экрана рядом со стрелкой вы видите пустой массив: []

Это означает, что, когда выполнил console.log(data) заявление, массив был пуст.

В самом деле, если вы наведете i с синим фоном он будет говорить:

Object value at left was snapshotted when logged, value below was evaluated just now. 

При нажатии на консоли, чтобы расширить и проверить содержимое массива, массив был перепроверены и показано на рисунке. К этому времени вызовы api были завершены, и массив заполнился.

Вам просто нужно перевести вызов на deferred.resolve(data); на самый внутренний обратный вызов и называть его только после завершения всех обратных вызовов.

+0

Поскольку внутренняя часть обратного вызова находится внутри оператора 'angleular.forEach()', как это будет работать точно? Обетование будет разрешено на первой итерации, и я не получу остальную часть данных. Я прав? – Rafay

+0

Да, это правильно. Вам нужно решить только после завершения последнего. Таким образом, с вашим текущим дизайном отслеживать счет и сравнивать его с длиной или использовать цикл for и index вместо forEach. – tasseKATT

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