for循环完成后调用函数

时间:2017-03-07 13:07:41

标签: javascript angularjs http angular-promise

我尝试在完成for循环后调用函数$scope.getThisFunction($scope.Num),我尝试了下面的代码,但没有工作。有什么建议吗?

for(var i = 0; i < $scope.selection.length; i++) {                
    $http({
        method: "POST",
        url: '/url/' + $scope.Num + '/' + $scope.selection[i]
    }).then(function mySucces(response) {
        if(i == $scope.selection.length - 1) {  
           $scope.getThisFunction($scope.Num); //not working
        }
    }, function myError(response) {
        alert("SORRY, SOME TECHNICAL ERROR OCCUR");
    });
}

2 个答案:

答案 0 :(得分:1)

制作单独的函数并在该函数内使用http请求。因为当循环循环时它引用相同的引用。即使它创建了新的闭包,它也有相同的参考。所以它只采用了for循环的最后一个索引

for (var i = 0; i < $scope.selection.length; i++) {
    sendReq(i)
};

function sendReq(i) {
    $http({
        method: "POST",
        url: '/url/' + $scope.Num + '/' + $scope.selection[i]
    }).then(function mySucces(response) {
        if (i == $scope.selection.length - 1) {
            $scope.getThisFunction($scope.Num); //not working
        }
    }, function myError(response) {
        alert("SORRY, SOME TECHNICAL ERROR OCCUR");
    });
}

答案 1 :(得分:1)

我不确定你要完成什么。在您的示例中,您必须使用

if (i === $scope.selection.length)

但会多次触发,因为当每个承诺结算时,条件很可能总是为真。

你应该使用$ q.all并传递一组promises。 $ q是一个角度服务,你只需要注入它。

<强>未测试

var promises = []

for (var i = 0; i < $scope.selection.length; i++) {
  promises.push($http({
    method: 'POST',
    url: '/url/' + $scope.Num + '/' + $scope.selection[i]
  });
}

$q.all(promises).then(function() {
  $scope.getThisFunction($scope.Num);
}, function() {
  alert('Error')
});

修改

我看到你接受了另一个答案。让我知道,保留代码并通过let替换var而不是使用函数闭包会更容易。当然,只有在ES6环境中工作时,这才有效。

for(let i = 0; i < $scope.selection.length; i++)
  ...