Вопрос

В окно.Настройка времени выхода (и связанная с ней функция setInterval) в Javascript позволяет вам запланировать выполнение функции когда-нибудь в будущем:

id = setTimeout(function, delay);

где "задержка" - это количество миллисекунд в будущем, в которое вы хотите вызвать функцию.По истечении этого времени вы можете отменить таймер, используя:

clearTimeout(id);

Чего я хочу состоит в том , чтобы Обновить таймер.Я хочу иметь возможность опережать или замедлять таймер, чтобы функция вызывалась на x миллисекунд раньше или позже чем первоначально планировалось.

Если бы существовал метод getTimeout, вы могли бы сделать что-то вроде:

originally_scheduled_time = getTimeout(id);
updateTimeout(id, originally_schedule_time + new_delay);  // change the time

но, насколько я могу судить, нет ничего похожего на getTimeout или какой-либо способ обновить существующий таймер.

Есть ли способ получить доступ к списку запланированных аварийных сигналов и изменить их?

Есть ли лучший подход?

Спасибо!

Это было полезно?

Решение

Если вы действительно хотите такую функциональность, вам нужно будет написать ее самостоятельно.

Вы могли бы создать оболочку для вызова setTimeout, которая вернет объект, который вы можете использовать для "отсрочки" таймера:

function setAdvancedTimer(f, delay) {
  var obj = {
    firetime: delay + (+new Date()), // the extra + turns the date into an int 
    called: false,
    canceled: false,
    callback: f
  }; 
  // this function will set obj.called, and then call the function whenever
  // the timeout eventually fires.
  var callfunc = function() { obj.called = true; f(); }; 
  // calling .extend(1000) will add 1000ms to the time and reset the timeout.
  // also, calling .extend(-1000) will remove 1000ms, setting timer to 0ms if needed
  obj.extend = function(ms) {
    // break early if it already fired
    if (obj.called || obj.canceled) return false; 
    // clear old timer, calculate new timer
    clearTimeout(obj.timeout);
    obj.firetime += ms;
    var newDelay = obj.firetime - new Date(); // figure out new ms
    if (newDelay < 0) newDelay = 0;
    obj.timeout = setTimeout(callfunc, newDelay);
    return obj;
  };
  // Cancel the timer...  
  obj.cancel = function() {
    obj.canceled = true;
    clearTimeout(obj.timeout);
  };
  // call the initial timer...
  obj.timeout = setTimeout(callfunc, delay);
  // return our object with the helper functions....
  return obj;
}

var d = +new Date();
var timer = setAdvancedTimer(function() { alert('test'+ (+new Date() - d)); }, 1000);

timer.extend(1000);
// should alert about 2000ms later

Другие советы

Я думаю, что нет.Лучшим подходом могло бы быть написание вашей собственной оболочки, в которой хранятся ваши таймеры (func-ref, delay и timestamp).Таким образом, вы можете притвориться, что обновляете таймер, очистив его, и вычислить копию с обновленной задержкой.

Еще одна обертка:

function SpecialTimeout(fn, ms) {
    this.ms = ms;
    this.fn = fn;
    this.timer = null;
    this.init();
}

SpecialTimeout.prototype.init = function() {
    this.cancel();
    this.timer = setTimeout(this.fn, this.ms);
    return this;
};

SpecialTimeout.prototype.change = function(ms) {
    this.ms += ms;
    this.init();
    return this;
};

SpecialTimeout.prototype.cancel = function() {
    if ( this.timer !== null ) {
        clearTimeout(this.timer);
        this.timer = null;
    }
    return this;
};

Использование:

var myTimer = new SpecialTimeout(function(){/*...*/}, 10000);

myTimer.change(-5000); // Retard by five seconds
myTimer.change(5000); // Extend by five seconds
myTimer.cancel(); // Cancel
myTimer.init(); // Restart

myTimer.change(1000).init(); // Chain!

Возможно, это не совсем то, что вы хотите, но все равно взгляните, может быть, вы сможете использовать это себе на пользу.

Существует отличное решение, написанное моим бывшим коллегой, которое может создавать специальные функции-обработчики, которые при необходимости могут останавливать и запускать тайм-ауты.Он наиболее широко используется, когда вам нужно создать небольшую задержку для событий наведения курсора.Например, когда вы хотите скрыть меню наведения курсора мыши не точно в тот момент, когда мышь покидает его, а несколькими миллисекундами позже.Но если мышь возвращается, вам нужно отменить тайм-аут.

Решение - это функция, вызываемая Обработчики getDelayedHandlers.Например, у вас есть функция, которая показывает и скрывает меню

function handleMenu(show) {
    if (show) {
        // This part shows the menu
    } else {
        // This part hides the menu
    }
}

Затем вы можете создать для него отложенные обработчики, выполнив таким образом:

var handlers = handleMenu.getDelayedHandlers({
    in: 200, // 'in' timeout
    out: 300, // 'out' timeout
});

handlers становится объектом, содержащим две функции-обработчика, которые при вызове отменяют время ожидания другой.

var element = $('menu_element');
element.observe('mouseover', handlers.over);
element.observe('mouseout', handlers.out);

P.S.Чтобы это решение сработало, вам необходимо расширить функциональный объект с помощью curry функция, которая автоматически выполняется в Прототип.

Одна из возможностей может быть такой:

if (this condition true)
{
  setTimeout(function, 5000);
}
elseif (this condition true)
{
  setTimeout(function, 10000);
}
else
{
  setTimeout(function, 1000);
}

Это зависит от вас, как вы строите свои условия или логику.Спасибо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top