我尝试在完成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");
});
}
答案 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++)
...