Angularjs переопределить (отменить) тайм-аут, если он уже существует - PullRequest
0 голосов
/ 02 июля 2019

У меня есть услуга

devApp.factory('flashFactory',['$timeout',function($timeout){
    var flashFactory = {};
    flashFactory.request = function($scope,variable){
        $timeout(function(){
            delete $scope[variable];
        },5000);
    }
    return flashFactory;
}]);

, который может удалить указанную переменную области видимости, Я использую вышеуказанный сервис для удаления сообщения из переменной через 5 секунд после создания сообщения, всякий раз, когда новое сообщение создается в той же переменной области, нужно подождать 5 секунд, после чего оно должно быть удалено, но проблема заключается в том, что работает какой-либо предыдущий тайм-аут для той же переменной области видимости она должна быть переопределена новым тайм-аутом, поэтому сообщение должно отображать 5сек, кто-нибудь, помогите мне, спасибо.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Сохраните обещание, возвращенное $timeout, и используйте его для отмены предыдущего тайм-аута:

devApp.service('flashFactory',function($timeout){
    var promiseCache = {};
    this.request = function request($scope,variable){
        var id = $scope.$id + variable;
        promiseCache[id] && $timeout.cancel(promiseCache[id]);
        promiseCache[id] = $timeout(function(){
            delete $scope[variable];
        },5000);
    }
});

Служба создает идентификатор на основе $id области действия и имени переменной. Он сохраняет обещание, возвращенное $timeout, и использует его для отмены предыдущего $timeout.

Для получения дополнительной информации см.

0 голосов
/ 02 июля 2019

Я совершенно слепой здесь, написал этот ответ, основываясь на предположении, и попытайтесь понять этот фрагмент перед использованием!

devApp.factory('flashFactory', ['$timeout', function($timeout) {
    var flashFactory = {};
    flashFactory.timeoutArr = [];
    flashFactory.request = function($scope, variable) {
        flashFactory.timeoutArr.ifFindThenDelete(variable, $timeout);
        var timeOutObj = {};
        timeOutObj.myvar = variable;
        timeOutObj.fn = $timeout(function() {
            delete $scope[variable];
        }, 5000);
        flashFactory.timeoutArr.push(timeOutObj);

    }
    return flashFactory;
}]);


Array.prototype.ifFindThenDelete = function(variable, $timeout) {
    var i = this.length
    while (i--) {
        if (this[i].myvar == variable) {
            $timeout.cancel(this[i].fn)
            this.splice(i, 1);
        }
    }
}; 
...