Frage

Die window.setTimeout (und verwandte setInterval) Funktion in Javascript ermöglicht es Ihnen, irgendwann in der Zukunft eine Funktion planen ausgeführt werden:

id = setTimeout(function, delay);

, wobei „Verzögerung“ ist die Anzahl von Millisekunden in die Zukunft, an den Sie wollen so genannte Funktion haben. Vor Ablauf dieser Zeit können Sie den Timer beenden mit:

clearTimeout(id);

Was ich will, ist auf Update der Timer. Ich möchte in der Lage sein, um einen Timer zu beschleunigen oder zu verzögern, so dass die Funktion aufgerufen wird x Millisekunden früher oder später als ursprünglich geplant.

Wenn es eine Methode getTimeout ist, können Sie etwas tun könnten, wie:

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

aber soweit ich das sagen kann, es gibt nichts wie getTimeout oder irgendeine Weise einen vorhandenen Timer zu aktualisieren.

Gibt es eine Möglichkeit, um die Liste der geplanten Alarme und sie ändern?

Gibt es einen besseren Ansatz?

Danke!

War es hilfreich?

Lösung

Wenn Sie wirklich diese Art von Funktionalität wollen, sind Sie nach Bedarf geht es selbst zu schreiben.

Sie können einen Wrapper für den setTimeout Anruf erstellen, die ein Objekt zurückkehren Sie verwenden können „verschieben“, um den Timer:

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

Andere Tipps

Ich glaube nicht. Ein besserer Ansatz könnte sein, Ihre eigenen Wrapper zu schreiben, die Ihre Timer speichern (func-ref, Verzögerung und Zeitstempel). Auf diese Weise können Sie einen Timer zu aktualisieren, so tun, indem sie das Clearing und eine Kopie mit einer aktualisierten Verzögerung zu berechnen.

Ein weiterer Wrapper:

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;
};

Verbrauch:

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!

Es kann nicht genau, was Sie wollen, aber einen Blick sowieso nehmen, vielleicht können Sie es zu Ihrem Vorteil nutzen.

Es gibt eine große Lösung, die durch meinen Ex-Mitarbeiter geschrieben, die speziellen Handler-Funktionen erstellen kann, die Timeouts stoppen und starten, wenn erforderlich. Es wird am häufigsten verwendet, wenn Sie eine kleine Verzögerung für Hover-Ereignisse erstellen müssen. Wie, wenn Sie ein Mouseover-Menü auszublenden nicht genau zu der Zeit, wenn eine Maus Blätter, aber ein paar Millisekunden später. Aber wenn eine Maus zurück kommt, müssen Sie den Timeout beenden.

Die Lösung ist eine Funktion namens getDelayedHandlers . Zum Beispiel haben Sie eine Funktion, dass Blendet ein Menü

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

Sie können dann für sich verzögert Handler erstellen, indem Sie so:

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

handlers wird ein Objekt, das zwei Handler-Funktionen enthält, dass, wenn Abbrechen der andere ist Timeout aufgerufen wird.

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

P. S. Für diese Lösung zu arbeiten müssen Sie die Funktion Objekt mit der curry Funktion erweitern, die automatisch in Prototype erfolgt .

Eine Möglichkeit, wie das sein kann:

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

Es ist bis zu Ihrem, wie Sie Ihre Bedingungen oder die Logik konstruieren. Dank

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top