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

How to pass arguments through factories requests

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

我试过:

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

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

我收到了这个错误 undefined 我应该收到 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'
    });

不知道,可能是工厂订单什么的?

从你的代码来看,这是一个典型的异步回调问题。您可能必须先通过阅读其他地方来了解 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
});

有两个问题。修剪函数的内容显示第一个问题:

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
    }
);