2015-11-05 3 views
1

Я новичок в AngularJS и экспериментирую с AngularJS с Twitch API.AngularJS - Выполняется ли код контроллера по строкам?

У меня есть список каналов, которые меня интересуют, определяемые как var channels.

Затем я использую функцию $http.get для прохождения через другой массив, twitchList.channels, который содержит адреса API, которые я должен назвать.

(function() { 
    var app = angular.module('twitchList', []); 

    app.controller('twitchController', ['$http', function($http){ 
    var twitchList = this; 
    twitchList.channels = []; 
    var channels = ["freecodecamp", "storbeck", "terakilobyte", "habathcx","RobotCaleb","thomasballinger","noobs2ninjas","beohoff", "MedryBW"]; 

    for (var i = 0; i < channels.length; i++) { 
     twitchList.channels.push({ 
     name: channels[i], 
     api: 'https://api.twitch.tv/kraken/streams/' + channels[i], 
     }) 
    } 

    var data_list = []; 
    for (var j = 0; j < twitchList.channels.length; j++) { 
     $http.get(twitchList.channels[j].api).success(function(data){ 
     data_list.push(data); 
     }) 
    } 

    // Issue arises here! 
    console.log(data_list); 
    console.log(data_list.length); 

    }]); 

})(); 

В API вызовы, кажется, работает отлично, однако, мне нужно, чтобы получить результаты вызова API в массив, называемый data_list. Теперь, когда я печатаю data_list и data_list.length, происходит то, что data_list.length всегда возвращает 0, а data_list иногда заполняется (это означает, что это либо массив размера 0, либо массив 9 размера). Несмотря на то, что свойство массива имеет длину 9, но вызов .length всегда дает 0.

Это позволяет мне думать, что код контроллера не выполняется по строкам? Или что-то не так с моей логикой?

Может ли кто-нибудь дать мне указатель? Благодаря

+1

$ HTTP является асинхронным и data_list не будут поданы с вашими данными с сервера, следовательно, его возвращает 0, вы можете утешить его внутри успеха обратного вызова $ HTTP –

+1

Код выполняется асинхронной data_list.push (данные) ; произойдет после console.log. –

+1

@shushanthp Ну, 'data_list' доступен в области видимости, но вы правы, что никакие данные не нажимаются до тех пор, пока не будет вызван обратный вызов успеха. – jensgram

ответ

3

Нет, эта линия:

data_list.push(data); 

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

console.log(data_list); 
console.log(data_list.length); 

выведет [] и 0

+0

Спасибо за ваш ответ! Есть ли способ сохранить блокировку до тех пор, пока не будет выполнен асинхронный код? – user1157751

+0

Даже если есть такой инструмент (я не знаю, действительно ли он существует или нет), это плохое решение. JS использует неблокирующие асинхронные вызовы на основе обратных вызовов –

+0

Хм ... Я так думаю, поскольку JS - однопоточное приложение. Возможно, мне придется передумать, как это делается. – user1157751

1

Я не использовал его раньше, но вы могли бы, возможно, использовать $q.all для того, чтобы решить несколько обещаний? Я использовал эквивалентную функцию $.when в jQuery для достижения этого в прошлом.

var data_list = []; 
var promise_array = []; 
var request; 

for (var j = 0; j < twitchList.channels.length; j++) { 
    request = $http.get(twitchList.channels[j].api); 
    request.success(function(data) { 
     data_list.push(data); 
    }); 
    promise_array.push(request); 
} 

$q.all(promise_array).then(function() { 
    console.log(data_list); 
    console.log(data_list.length); 
}); 
Смежные вопросы