2

私は現在、ユーザーのログイン時にサービスを呼び出してサーバー呼び出しを開始してカウントを更新し、ユーザーが認証されている場合にのみサーバー側のリターンを許可するAngularアプリケーションを持っています。

resource.approvalsCount = 0;
var approvalsCountTimer;
resource.getApprovalsCount = function (username) {
    return resource.query({
        username: username,
        q: 'approvalsCount'
    }).$then(function (response) {
        resource.approvalsCount = response.data.count;
        approvalsCountTimer = $timeout(resource.getApprovalsCount, 3000);
        return resource.approvalsCount;
    });
};

ユーザーがログアウトすると、そのカウンターをキャンセルしようとしています。そうしないと、サーバーはリソースに基づいて関数を呼び出して 401 無許可エラーを返します。

resource.cancelTimers = function () {
    $timeout.cancel(approvalsCountTimer);
}

問題は、サーバーから 401 を返す $timeout でキャンセルを呼び出した後でも、カウンターが引き続き実行されることです。コンソールからログアウトすると、キャンセル機能が true を返します (キャンセルが機能しました)。$timeout の開始位置をいくつか試してみましたが、うまくいきませんでした。すべての $timeout が確実にキャンセルされるようにする方法はありますか? この構成で何が欠けているのかわかりません。

編集

angular.module('resources.approvals.approvals', ['ngResource'])
    .factory('Approvals', ['$timeout', '$resource', function ($timeout, $resource) {
    var resource = $resource('/approvals/:username/:requestID', {}, {
        'update': {
            method: 'PUT'
        }
    });
    resource.approvalsCount = 0;
    var approvalsCountTimer;
    resource.getApprovalsCount = function (username) {
        return resource.query({
            username: username,
            q: 'approvalsCount'
        }).$then(function (response) {
            resource.approvalsCount = response.data.count;
            approvalsCountTimer = $timeout(resource.getApprovalsCount, 3000);
            return resource.approvalsCount;
        });
    };
    resource.cancelTimers = function () {
        $timeout.cancel(approvalsCountTimer);
    };
    return resource;
}]);
4

1 に答える 1