Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS-控制器代码是否逐行执行?_Javascript_Angularjs - Fatal编程技术网

Javascript 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){

我是AngularJS的新手,正在用TwitchAPI试验AngularJS

我有一个我感兴趣的频道列表,定义为
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是一个单线程应用程序。我可能需要重新考虑一下是怎么做的。