2017-03-07 238 views
0

我试着在完成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"); 
    }); 
} 
+4

在for循环中创建HTTP帖子并不是一个好主意。您应该重写您的API以在一次唯一调用中接受多个“选择”。 – Mistalis

+0

@Pratyush Pranjal 你希望''scope.getThisFunction($ scope.Num)''在循环的最后一个元素或最后一个响应中被调用吗? 如果您希望在最后一篇文章中回复时尝试使用promise('$ q.all') –

+0

http://stackoverflow.com/questions/21310964/angularjs-q-all – Gaurav

回答

0

做出单独的功能,并在该功能中使用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

重复投票的人,如果不理解问题,请留下。伟大的循环概念,完美工作..!谢谢 –

1

我不太确定你想要完成什么。在您的例子中,你不得不使用

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++) 
    ...