提问人:KhiladiBhaiyya 提问时间:5/2/2020 最后编辑:CommunityKhiladiBhaiyya 更新时间:5/6/2020 访问量:72
如何在 AngularJS 的 for 循环中调用另一个 HTTP 调用中的一个 HTTP 调用?
How to call one HTTP Call inside another HTTP Call in a for loop in AngularJS?
问:
我正在开发一个 AngularJS 应用程序。 我有以下数组:
$scope.fruits = [
{url1: 'appleColor', url2: 'appleDetail'},
{url1: 'orangeColor', url2: 'orangeDetail'},
{url1: 'grapesColor', url2: 'grapesDetail'},
];
现在,我像这样调用HTTP GET请求:
for(var i = 0; i < $scope.fruits.length; i++){
var fruit = $scope.fruits[i];
getFruitColor(fruit.url1).then(function(color){
getFruitDetail(fruit.url2).then(function(detail){
console.log("color is "+ color);
console.log("detail is "+ detail);
}):
});
}
function getFruitColor(url){
return $http({
method: 'GET', url: url, params: {} }).then(getFruitComplete, getFruitFailed);
}
function getFruitDetail(url){
return $http({ method: 'GET', url: url, params: {} }).then(getFruitDataComplete, getFruitDataFailed);
}
function getFruitDataComplete(response) {
return response.data;
}
function getFruitDataFailed(error) {
$log.error('Failed to get fruit data - ' + error.data);
}
function getFruitComplete(response) {
return response.data;
}
function getFruitFailed(error) {
$log.error('Failed to get fruit- ' + error.data);
}
现在,由于所有这些调用都是异步的,我预计 NETWORK 选项卡中的这些调用是这样的(由于异步性质,这些调用的顺序可能会有所不同):
getFruitColor('苹果色')
getFruitColor('橙色颜色')
getFruitColor('葡萄色')
getFruitDetail('appleDetail')
getFruitDetail('orangeDetail')
getFruitDetail('葡萄细节')
但我实际上在 NETWORK 选项卡中看到的是:
getFruitColor('苹果色')
getFruitColor('橙色颜色')
getFruitColor('葡萄色')
getFruitDetail('葡萄细节')
getFruitDetail('葡萄细节')
getFruitDetail('葡萄细节')
我是 AngularJS 和 Javascript 的初学者,我不明白这里有什么问题,以及为什么在内部 HTTP 调用中,fruits 数组最后一个元素的 url2 对于循环中的每个元素都会发生。 谁能解释一下为什么这种行为会发生在这里? 我应该怎么做才能达到预期的结果?
答:
尝试使用(或)代替此分配:。像这样的东西应该可以解决问题:let
const
var
var fruit = $scope.fruits[i];
for(var i = 0; i < $scope.fruits.length; i++) {
const fruit = $scope.fruits[i];
getFruitColor(fruit.url1).then(function(color) {
getFruitDetail(fruit.url2).then(function(detail) {
还可以考虑将迭代 (.let i
for(let i = ...)
请注意,这将被提升到外部作用域,并且每次迭代都将覆盖相同的变量。所有对 的调用将仅使用最新的值,这就是为什么您会看到 3 个带有 .var
getFruitDetail
fruit
grapesDetail
AND / 之间的主要区别在于函数作用域,而 / 是块作用域。这个链接可能会引起人们的兴趣:https://dev.to/sarah_chima/var-let-and-const--whats-the-difference-69e(或谷歌搜索var/let/const之间的区别)var
let
const
var
let
const
评论