2014-03-28 103 views
0

我正在爲循環中的每個項目發出AJAX請求,最終REST服務一次只能執行一個請求,所以我需要循環等待每個請求完成後再繼續下一個。我該怎麼做呢?

作爲參考,最終服務正在執行DynamoDB表上的更新任務 - 一次只能修改一個表,因此我需要等到我收到響應才能繼續。我可以一次性將它們全部發送到服務器並在那裏處理,儘管這會使每次更新完成後很難收到反饋。

angular.forEach($scope.someArray, 
    function (value) { 

     var postdata = { 
     bla: value 
     }; 

     $http.post('/some_url', postdata) 
     .then(
     function(result) { 
      console.log("Success."); 
     }, 
     function(data) { 
      console.log("Failure."); 
     } 
    ); 

    } 
); 
+0

您可以將整個數組返回,並帶回單個請求而不是循環的數組? – tymeJV

+0

我可以做到這一點,但我寧願單獨做,以便每次完成時都能顯示反饋。 – greg

回答

3

如果你真的必須一次使一個請求(你確定沒有更有效的方法嗎?),那麼你就必須要使用Angular.forEach以外的東西。

關於這樣的事情是什麼(你將需要注入$q):

function doWhateverWithAll(someArray) { 
    // Mark which request we're currently doing 
    var currentRequest = 0; 
    // Make this promise based. 
    var deferred = $q.deferred(); 
    // Set up a result array 
    var results = [] 
    function makeNextRequest() { 
    // Do whatever you need with the array item. 
    var postData = someArray[currentRequest].blah; 

    $http.post('some/url', postData) 
    .then(function (data){ 
     // Save the result. 
     results.push(data); 
     // Increment progress. 
     currentRequest++; 
     // Continue if there are more items. 
     if (currentRequest < someArray.length){ 
     makeNextRequest(); 
     } 
     // Resolve the promise otherwise. 
     else { 
     deferred.resolve(results); 
     } 
    }); 
    // TODO handle errors appropriately. 
    } 
    // return a promise for the completed requests 
    return deferred.promise; 
} 

然後,在你的控制器/服務,您可以執行以下操作:

doWhateverWithAll($scope.someArray) 

.then(function(results){ 
    // deal with results. 
}); 
+0

我正在更新DynamoDB表 - 不幸的是,一次只能完成一項操作,因此唯一的方法是將它們全部發布並處理服務器上的問題。您的解決方案適合我的需求,因爲我可以在每個表格更新時單獨返回反饋。 – greg

10

你真的需要forEach嗎?我不會用它,去這樣的事情:

function req(arr) { 
    if (angular.isArray(arr) && arr.length > 0) { 
    var postdata = { 
     bla: arr[0] 
    }; 
    $http.post('/some_url', postdata) 
     .then(
     function(result) { 
     console.log("Success."); 
     arr.shift(); 
     req(arr); 
     }, 
     function(data) { 
     console.log("Failure."); 
     // if you want to continue even if it fails: 
     //arr.shift(); 
     //req(arr); 
     } 
    ); 
    } 
} 
req($scope.someArray); 
+1

'req(arr.shift())'將發送移位值到下一個函數調用而不是新數組。你的代碼應該是這樣的: 'arr.shift(); req(arr);' –

+0

@PrashantPokhriyal你說得對!感謝您的注意!我更新了答案。 – Polmonite

相關問題