如何在 AngularJS 的 for 循环中调用另一个 HTTP 调用中的一个 HTTP 调用?

How to call one HTTP Call inside another HTTP Call in a for loop in AngularJS?

提问人:KhiladiBhaiyya 提问时间:5/2/2020 最后编辑:CommunityKhiladiBhaiyya 更新时间:5/6/2020 访问量:72

问:

我正在开发一个 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 对于循环中的每个元素都会发生。 谁能解释一下为什么这种行为会发生在这里? 我应该怎么做才能达到预期的结果?

javascript angularjs 循环异 步-javascript

评论

0赞 tbone849 5/3/2020
在进行第二次 $http 调用之前,您的 for 循环已到达末尾。

答:

2赞 groetzi 5/6/2020 #1

尝试使用(或)代替此分配:。像这样的东西应该可以解决问题:letconstvarvar 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 ifor(let i = ...)

请注意,这将被提升到外部作用域,并且每次迭代都将覆盖相同的变量。所有对 的调用将仅使用最新的值,这就是为什么您会看到 3 个带有 .vargetFruitDetailfruitgrapesDetail

AND / 之间的主要区别在于函数作用域,而 / 是块作用域。这个链接可能会引起人们的兴趣:https://dev.to/sarah_chima/var-let-and-const--whats-the-difference-69e(或谷歌搜索var/let/const之间的区别)varletconstvarletconst