2016-04-14 14 views
0

Ich verwende die RIOT GAMES API. Und ich verwende Fabriken für meine API-Aufrufe. Zuerst fordere ich den BeschwörerName an und dann benutze ich diesen Namen, um die ID dieses Beschwörers zu erhalten.Wie Argumente durch Fabriken Anfragen übergeben werden

Ich habe versucht, mit:

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

Und dann auf diesen $ Umfang zuzugreifen, aber es funktioniert nicht:

ich mit diesen Fehlern recived und undefined, wo ich die summonerId recive sollte. (21694436) Dies ist mein summonerID:

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 

ich die folgende JavaScript-Code erhalten haben:

'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 

    } 
]); 

ich das Argument summonerId passieren und diese Fabrik es erkennt sie nicht. 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' 
    }); 

Ich weiß nicht, vielleicht ist es ein Auftrag von Fabriken oder etwas ist?

Antwort

1

Aus Ihrem Code ist es ein typisches asynchrones Rückrufproblem. Möglicherweise müssen Sie Javascript Callback und Async-Architektur erst verstehen, indem Sie woanders lesen.

Der Grund ist, weil

APIAcces.getSummonerSummary() 

wird aufgerufen wird, wenn

APIAcces.getSummonerByName() 

Holen nicht abgeschlossen ist, so dass der summonerId nicht definiert ist, es ist nur eine Art der Asynchron-Programmierung.

so, dies zu korrigieren, müssen Sie Kette der Anruf zusammen wie folgt aus:

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

* Natur ajax des Seins async – devqon

+0

es für Ajax nicht notwendig ist, können Sie auch Sie „async“ Funktion wie Timeout gebaut besitzen() – Kossel

+0

Ich weiß, mehr, dass ich meine Es ist nicht das Javascript selbst, das in diesem Fall async ist, aber der Ajax Anruf – devqon

0

Es gibt zwei Probleme. Trimmen Sie den Inhalt Ihrer Funktionen zeigt das erste Problem:

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

Der dritte Parameter Parameter der schließlich ist, aber Sie sind nicht vorbei in einer Funktion. Sie sollten dies tun:

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

Das zweite Problem ist, dass Sie wahrscheinlich in der finally-Block trotzdem will das nicht. Wenn deine Anfrage fehlschlägt, hast du keine passende Beschwörer-ID, mit der du arbeiten kannst. Es sollte für den Erfolg Block verschoben werden:

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