AngularJS在$ http调用后添加到JSON对象

时间:2016-03-14 09:05:26

标签: javascript angularjs json angular-promise angularjs-http

我有一系列抽搐的绰号。现在我想调用他们的API来检索有关通道的数据,并将其附加到原始JSON对象,以便在我的解决方案的前端使用它。

现在,当我在console.log中获取$ https调用的结果时,我得到的结果是作为登录到控制台的对象,但是我无法弄清楚它为什么不将它附加到原始流数组并在我的HTML中显示。

感谢任何帮助

我的HTML:

<div ng-app="twitchAPI" ng-controller="streamController">
  {{ error }}
  <div>
  {{ streams }}
  </div>
</div>

我的应用:

var twitchAPI = angular.module('twitchAPI', []);

twitchAPI.controller('streamController', function($scope, $http) {

  $scope.streams = [{
    'nick': 'freecodecamp'
  }, {
    'nick': 'storbeck'
  }, {
    'nick': 'terakilobyte'
  }, {
    'nick': 'habathcx'
  }, {
    'nick': 'RobotCaleb'
  }, {
    'nick': 'thomasballinger'
  }, {
    'nick': 'noobs2ninjas'
  }, {
    'nick': 'beohoff'
  }, {
    'nick': 'brunofin'
  }, {
    'nick': 'comster404'
  }, {
    'nick': 'RiotGamesBrazil'
  }];

  var onInfoReceived = function(response) {
    return response.data;
  }

  var onInfoError = function(reason) {
    $scope.error = "Could not fetch the information!"
  }

  var getStreamInfo = function(nick) {
    $http.jsonp('https://api.twitch.tv/kraken/channels/' + nick + '?callback=JSON_CALLBACK')
      .then(onInfoReceived, onInfoError);
  }

  for (var x in $scope.streams) {
    $scope.streams[x].nick.channelInfo = getStreamInfo($scope.streams[x].nick);
  };

});

我还创建了codepen的东西,因为这是一个freeCodeCamp练习。

2 个答案:

答案 0 :(得分:1)

首先应该从getStreamInfo方法返回一个承诺,这样你就可以实现对它的承诺链接。然后按照IIFE限制$scope.streams[x]对象的范围,同时在循环中处理异步调用。

<强>代码

var getStreamInfo = function(nick) {
    return $http.jsonp('https://api.twitch.tv/kraken/channels/' + nick + '?callback=JSON_CALLBACK')
      .then(onInfoReceived, onInfoError);
}


for (var x in $scope.streams) {
   (function(stream){
        getStreamInfo(stream.nick).then(function(data){
           stream.channelInfo = data
        });
   })($scope.streams[x])
};

修改

还要在每个对象中添加channelInfo属性,而不是像@ThomasIllingworth建议的那样在每个对象的nick属性中添加它。

答案 1 :(得分:1)

这是失败的,因为您正在尝试访问字符串的属性.channelInfo。您需要编辑数组,以便创建可以添加属性的对象。像这样:

$scope.streams = [{
    nick: { 
        shortname: 'freecodecamp',
    }
}, {
    nick: { 
        shortname: 'storbeck',
    }
}];