0

複数の http リクエストを送信するサービス「UserData」があります。各リクエストの成功ハンドラーに対して、(コントローラー内の) 関数が呼び出されます。この関数は、ローカル ストレージ内のすべてを出力し (この例では 5 つのアイテムとします)、それらをすべて削除します。

私のJavaScriptの理解から、すべてが単一のスレッドで実行されます。つまり、複数のコールバックが同時に呼び出される可能性がありますが、それらは順番に (1 つずつ) 処理されます。最初のコールバックが 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 に移動されます。

しかし、その後1 にi++増加iするため、次の反復ではアイテムの削除を 0 でスキップします。繰り返します。

その結果、ループはストレージ内のアイテムの半分しか削除しません! この問題を回避するには、逆方向にループしてみてください。

    for (var i = localStorage.length; i--; ){
        localStorage.removeItem(localStorage.key(i));
    }
于 2013-11-25T16:57:01.103 に答える