如何通过工厂请求传递参数

时间:2016-04-14 16:36:40

标签: javascript angularjs factory mean.io

我使用RIOT GAMES API。我使用工厂进行API调用。首先,我请求summonerName然后我使用此名称来获取此summonerName的id。

我尝试过:

 $scope.summonerId = $scope.summoner.id;

然后访问此$ scope但它不起作用:

我在未定义时收到了此错误,我应该在其中找到summonerId。 (21694436)这是我的召唤师ID:

https://euw.api.pvp.net/api/lol/euw/v1.3/stats/by-summoner/undefined/summary?season=SEASON2016&api_key=foo-bar-foo-bar-foo-bar 

我有以下javascript代码:

'use strict';

angular.module('mean.system').controller('SummonerController', ['$scope', '$http','APIAcces', '$stateParams',
  function($scope, $http, APIAcces, $stateParams) {        

  $scope.summonerName = $stateParams.summonerName;

  APIAcces.getSummonerByName($scope.summonerName).then(

        function successCallback(response) {

           $scope.summoner = response.data[$scope.summonerName.toLowerCase()];                
           $scope.summonerId = $scope.summoner.id;

           console.log($scope.summonerId); //returns id successfuly
           console.log(response);
        }, function errorCallback(error) {

           console.log(error);
           console.log(response);
        },  

//if I do.. APIAcces.getSummonerSummary('21694436').then( // it works!
        APIAcces.getSummonerSummary($scope.summonerId).then(

            function successCallback(response) {

              $scope.summoner2 = response.data[$scope.summonerId]; 
              console.log(response);

            },function errorCallback(error) {
              console.log(error);
              console.log(response);
            }
        ) //End APIAcces.getSummonerSummary

  ); //End APIAcces.getSummonerByName

  }
]);

我传递了参数 summonerId ,而这个工厂它无法识别它。 I use this method:

angular.module('mean.system').factory('APIAcces',['$http','API_KEY',
        function($http,API_KEY){
            return {
                getSummonerByName:function(summonerName){
                    return     $http.get('https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/'+summonerName+'?api_key='+API_KEY.KEY);
                },
                getSummonerSummary:function(summonerId){
                    return     $http.get('https://euw.api.pvp.net/api/lol/euw/v1.3/stats/by-summoner/'+summonerId+'/summary?season=SEASON2016&api_key='+API_KEY.KEY);
                },
            }
        }]).value('API_KEY',{
            KEY: 'foo-bar-foo-bar-foo-bar'
    });

我不知道,也许这是一个工厂或其他什么的订单?

2 个答案:

答案 0 :(得分:1)

从您的代码中,它是典型的异步回调问题。你可能必须先通过阅读其他地方来了解javascript回调和异步架构。

原因是因为

APIAcces.getSummonerSummary()

时正在调用

APIAcces.getSummonerByName()

尚未完成提取,因此summonerId未定义,它只是异步编程的本质。

所以为了纠正这个问题,你可以把这个电话链接起来:

    APIAcces.getSummonerByName($scope.summonerName).then(
    function(response){
        var summonerId; //extract the id from response
        APIAcces.getSummonerSummary(summonerId).then(
            function(response){
              //response should contain the summary
            },
            function(error){
                //error of getting by id
            }
        );
    },function(error){
    //error of getting by name
});

答案 1 :(得分:0)

有两个问题。修剪功能的内容会显示第一个问题:

APIAcces.getSummonerByName($scope.summonerName).then(

    function successCallback(response) {
        // success
    },
    function errorCallback(error) {
        // failure
    },  
    APIAcces.getSummonerSummary($scope.summonerId).then(
        function successCallback(response) {
            // inner success
        },
        function errorCallback(error) {
            // outer success
        }
    )
);

第三个参数是finally参数,但您没有传入函数。你应该这样做:

APIAcces.getSummonerByName($scope.summonerName).then(

    function successCallback(response) {
        // success
    },
    function errorCallback(error) {
        // failure
    },
    function finallyCallback() {
        APIAcces.getSummonerSummary($scope.summonerId).then(
            function successCallback(response) {
                // inner success
            },
            function errorCallback(error) {
                // inner failure
            }
        )
    }
);

第二个问题是你可能不想在finally块中想要这个。如果您的请求失败,您将无法使用适当的召唤者ID。它应该移动到成功块:

APIAcces.getSummonerByName($scope.summonerName).then(

    function successCallback(response) {
        // success

        APIAcces.getSummonerSummary($scope.summonerId).then(
            function successCallback(response) {
                // inner success
            },
            function errorCallback(error) {
                // inner failure
            }
        )
    },
    function errorCallback(error) {
        // failure
    }
);