如何通过工厂请求传递参数
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
}
);
我用的是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
}
);