2017-03-07 30 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++) 
    ...