2016-04-14 3 views
0

Я использую RIOT GAMES API. И я использую заводы для вызовов API. Прежде всего, я запрашиваю имя summonerName, а затем я использую это имя, чтобы получить идентификатор этого summonerName.Как передать аргументы через запросы фабрик

Я попытался с:

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

А затем получить доступ к этим $ охвата, но он не работает:

Я RECIVED этой ошибки с и неопределенными, где я должен Recive в summonerId. (21694436) это мой 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 

Я получил следующий код яваскрипта:

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

Я не знаю, может быть, это приказ заводов или что-то?

ответ

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

* природа Аякса быть асинхронной – devqon

+0

это не нужно для AJAX, вы можете даже построили у вас есть функция «асинхронной», как тайм-аут() – Kossel

+0

я знаю, больше, что я имею в виду это не сам javascript, асинхронный в этом случае, но вызов ajax – devqon

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

Третий параметр является, наконец, параметр, но вы не переходящая в функции. Вы должны сделать это:

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

Вторая проблема заключается в том, что вы, вероятно, не хотите, чтобы это в конце концов блокирует все равно. Если ваш запрос не удался, у вас не будет соответствующего идентификатора вызывающего абонента для работы. Он должен быть перемещен в блок успеха:

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 
    } 
); 
Смежные вопросы