Javascript AngularJS-控制器代码是否逐行执行?
我是AngularJS的新手,正在用TwitchAPI试验AngularJS 我有一个我感兴趣的频道列表,定义为Javascript AngularJS-控制器代码是否逐行执行?,javascript,angularjs,Javascript,Angularjs,我是AngularJS的新手,正在用TwitchAPI试验AngularJS 我有一个我感兴趣的频道列表,定义为var频道 然后我使用$http.get函数循环另一个数组twitchList.channels,其中包含我应该调用的API地址 (function() { var app = angular.module('twitchList', []); app.controller('twitchController', ['$http', function($http){
var频道
然后我使用$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);
}]);
})();
(函数(){
var app=angular.module('twitchList',[]);
app.controller('twitchController',['$http',函数($http){
var twitchList=此;
twitchList.channels=[];
var信道=[“freecodecamp”、“storbeck”、“TB”、“habathcx”、“RobotCaleb”、“thomasballinger”、“Noobs2nijas”、“beohoff”、“MedryBW”];
对于(变量i=0;i
API调用似乎工作得很好,但是,我需要将API调用的结果放入一个名为data\u list
的数组中。现在,当我打印data\u list
和data\u list.length
时,发生的情况是data\u list.length
总是返回0,并且data\u list
有时会填充(这意味着它是0大小的数组或9大小的数组)。尽管数组的属性的长度为9,但调用.length
始终会得到0
这让我认为控制器代码不是逐行执行的?还是我的逻辑有问题
谁能给我一个指针吗?谢谢不,这行:
data_list.push(data);
将在您收到上面一行发送的http请求响应时执行。因此,有以下几行:
console.log(data_list);
console.log(data_list.length);
将输出[]和0否,此行:
data_list.push(data);
将在您收到上面一行发送的http请求响应时执行。因此,有以下几行:
console.log(data_list);
console.log(data_list.length);
将输出[]和0我以前没有使用过它,但您是否可以使用
$q.all
来解析多个承诺?过去,我在jQuery中使用了等价的$.when
函数来实现这一点
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);
});
var数据列表=[];
var_数组=[];
var请求;
对于(var j=0;j
我以前没有使用过它,但您是否可以使用$q.all
来解决多个承诺?过去,我在jQuery中使用了等价的$.when
函数来实现这一点
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);
});
var数据列表=[];
var_数组=[];
var请求;
对于(var j=0;j
$http是异步的,数据列表不会与服务器上的数据一起归档,因此它返回0,您可以在$http的成功回调中对其进行控制台。代码执行异步数据列表。推送(数据);将在console.log之后发生。@shushanthp嗯,data\u list
在作用域上可用,但您是对的,在调用成功回调之前不会推送数据。谢谢大家,在所有延迟/承诺完成之前,是否仍要继续阻止?使用$q.all
$http是异步的,数据列表不会与服务器上的数据一起归档,因此它返回0,您可以在$http的成功回调中对其进行控制台。代码执行异步数据列表。推送(数据);将在console.log之后发生。@shushanthp好的,数据列表
在作用域上可用,但您是对的,在调用成功回调之前不会推送任何数据。谢谢大家,在所有延迟/承诺完成之前是否仍有阻塞?使用$q.all
谢谢您的回复!有没有办法在异步代码完成之前保持阻塞?即使有这样的工具(我不知道它是否存在),这也是一个糟糕的解决方案。JS使用基于callbacksHmm的非阻塞异步调用。。。我想是的,因为JS是一个单线程应用程序。我可能需要重新考虑一下,谢谢你的回复!有没有办法在异步代码完成之前保持阻塞?即使有这样的工具(我不知道它是否存在),这也是一个糟糕的解决方案。JS使用基于callbacksHmm的非阻塞异步调用。。。我想是的,因为JS是一个单线程应用程序。我可能需要重新考虑一下是怎么做的。