【问题标题】:AngularJS $resource - adding array element to paramDefaultsAngularJS $resource - 将数组元素添加到 paramDefaults
【发布时间】:2017-01-21 16:21:17
【问题描述】:

我正在使用 twitch.tv api 并使用 Angular $resource 工厂。我尝试使用的端点是:GET /channels/:channel。我要做的是获取每个数组元素的通道。我试过 /channels/users[1] 但我知道这是错误的。如何获取数组中所有用户的 :channel ?或者有更好的方法吗?

    (function() {
       angular.module('twitch', ['ngResource'])

       .controller('TwitchController', ['$scope', 'TwitchAPI', function($scope, TwitchAPI) {   
         $scope.getAPI = function(){
           var users = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];  
           for(var i = 0; i < 8; i++){
           TwitchAPI.get({channel: users.i});
         }
       }
       $scope.online = [];
       $scope.offline = [];


  }])

  .factory('TwitchAPI', function TwitchAPIFactory($resource){
     return $resource('https://api.twitch.tv/kraken/channels/:channel', { callback: "JSON_CALLBACK" });
   });
})();

【问题讨论】:

    标签: javascript angularjs jsonp angular-resource twitch


    【解决方案1】:

    首先,您不需要使用 JSONP,因为 Twitch API 支持 CORS 请求,您可以像这样配置您的 $resource

    return $resource('https://api.twitch.tv/kraken/channels/:channel', {}, {
        get: {
            method: 'GET',
            headers: {
                Accept: 'application/vnd.twitchtv.v3+json',
                'Client-ID': 'Your client ID'
            }
        }
    })
    

    如果你真的想使用 JSONP,你不能在请求中发送头信息,所以它必须看起来像

    return $resource('https://api.twitch.tv/kraken/channels/:channel', {
        callback: 'JSON_CALLBACK',
        api_version: 3,
        client_id: 'your client ID'
    }, {
        get: {
            method: 'JSONP'
        }
    })
    

    似乎没有办法一次获取多个频道(参考:https://github.com/justintv/Twitch-API/blob/master/v3_resources/channels.md),但您应该能够并行进行

    你可以像这样创建一个简单的 Promise 数组

    var promises = users.map(user => TwitchAPI.get({channel: user}).$promise);
    

    然后您可以使用$q.all 等待所有承诺解决

    $q.all(promises).then(channels => {
        angular.forEach(channels, channel => {
            // access each channel's properties here
            console.log('Channel name:', channel.display_name);
        });
    });
    

    别忘了注入$q 服务。

    【讨论】:

    • 谢谢!我还在学习 Angular,所以我会试试你的解决方案。
    • 我如何真正从 api 获取数据?会不会是这样的:user.url? @菲尔
    • @labanch 抱歉,我不明白这个问题。每个请求的响应应该在angular.forEach 循环中使用的channel 变量中可用。应该是这样的~github.com/justintv/Twitch-API/blob/master/v3_resources/…
    • 抱歉,我的问题不是很清楚。如果我想访问响应的“logo”属性,我该怎么做?当我使用 $http.jsonp 时,我可以为数据执行成功回调函数,然后通过执行“data.propertyname”访问属性,如下所示:
    • 请看前面的评论。我使用了 $http.jsonp 并使用了成功回调函数来访问数据。例如,.success(function(data)){ $scope.example = data.logo;我将如何使用您的解决方案访问数据的属性? Channel.propertyname?再次感谢你的帮助! @菲尔
    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多