2013-11-25 81 views
0

我有一個服務'UserData'發送多個http請求。對於每個請求的成功處理程序,都會調用一個函數(在一個控制器中)。該功能打印出本地存儲中的所有內容(例如,可以說5個項目)並將其全部刪除。多個Ajax回調函數編輯localStorage

從我對javascript的理解中,一切都是在單線程中執行的。這意味着即使在可能同時調用多個回調的情況下,它們也會按順序處理(逐個處理)。現在,當第一個回調循環通過localStorage並刪除所有項目時,我希望所有後續回調都不會從localStorage中打印任何內容,因爲所有項目都應該已經被刪除。

但是,當我測試這個理論時,本地存儲中的所有5個項目都會打印出每個回調。這可能更像是一個JavaScript問題而不是角度問題,但任何見解都將被讚賞。

服務:

app.factory('UserData', ['$http', 
    function($http) { 

     return { 

      save: function(data, apiEndpoint, scope) { 

       $http({method: 'PUT', url: apiEndpoint, 

        headers: { 
         'Content-Type': 'application/x-www-form-urlencoded' }, 

        data: data}). 
        success(function(data, status, headers, config) { 

         scope.processFailedQueue(); 

        }). 
        error(function(rdata, status, headers, config) { 


        }); 

      } 

     }; 

    } 

]); 

控制器:

function baseFunctionController($scope, $location, $route, $http, contentService, UserData) { 

    $scope.processFailedQueue = function() { 

     for (var i = 0; i < localStorage.length; i++){ 
      console.log(localStorage.key(i)); 
     } 

     for (var i = 0; i < localStorage.length; i++){ 
      localStorage.removeItem(localStorage.key(i)); 
     } 

    } 
} 

回答

0

只是一個想法:

for (var i = 0; i < localStorage.length; i++){ 
     localStorage.removeItem(localStorage.key(i)); 
    } 

如果第一次迭代的位置0刪除的項目,然後localStorage.length應立即降低,移動剩下的所有物品,並移動處於位置1的物品到位置0.

但是然後i++i增加爲1,因此在下一次迭代時,您跳過現在刪除的項目爲0.重複。

因此,您的循環僅刪除存儲中的一半物品!爲避免此問題,請嘗試向後循環:

for (var i = localStorage.length; i--;){ 
     localStorage.removeItem(localStorage.key(i)); 
    }