for循环完成后的调用函数
问题描述:
我试着在完成for循环后调用函数$scope.getThisFunction($scope.Num)
,我试着在代码下面但不工作。任何建议?for循环完成后的调用函数
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");
});
}
答
做出单独的功能,并在该功能中使用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");
});
}
+0
重复投票的人,如果不理解问题,请留下。伟大的循环概念,完美工作..!谢谢 –
答
我不太确定你想要完成什么。在您的例子中,你不得不使用
if (i === $scope.selection.length)
但会触发多次,当每一个承诺解决的情况应该最有可能永远是正确的。
您应该使用$ q.all并将其传递给一组promise。 $ 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')
});
编辑:
我看到你接受了另一个答案。让我来简单地保留你的代码,并通过让它替换var而不是使用函数闭包。如果你在ES6环境中工作,这当然只能工作。
for(let i = 0; i < $scope.selection.length; i++)
...
在for循环中创建HTTP帖子并不是一个好主意。您应该重写您的API以在一次唯一调用中接受多个“选择”。 – Mistalis
@Pratyush Pranjal 你希望''scope.getThisFunction($ scope.Num)''在循环的最后一个元素或最后一个响应中被调用吗? 如果您希望在最后一篇文章中回复时尝试使用promise('$ q.all') –
http://stackoverflow.com/questions/21310964/angularjs-q-all – Gaurav