私は現在、ユーザーのログイン時にサービスを呼び出してサーバー呼び出しを開始してカウントを更新し、ユーザーが認証されている場合にのみサーバー側のリターンを許可する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;
}]);