我有一个服务'UserData',它发出多个http请求。对于每个请求的成功处理程序,调用一个函数(在控制器中)。此功能打印出本地存储中的所有内容(本例中可以说5个项目)并将其全部删除。
根据我对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 :(得分: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));
}