多个ajax回调函数编辑localStorage

时间:2013-11-25 16:38:34

标签: javascript ajax angularjs asynchronous angular-services

我有一个服务'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));
        }

    }
} 

1 个答案:

答案 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));
    }