0

我有一个发送多个 http 请求的服务“UserData”。对于每个请求的成功处理程序,调用一个函数(在控制器中)。此函数打印出本地存储中的所有内容(对于此示例,假设为 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));
        }

    }
} 
4

1 回答 1

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));
    }
于 2013-11-25T16:57:01.103 回答