我使用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'
});
我不知道,也许这是一个工厂或其他什么的订单?
答案 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
}
);