2016-04-26 6 views
0

ausgelöst Gibt es eine einfache Möglichkeit, in JS, so etwas zu tun:Zeitplan Arbeit geschieht nach some sonst

var scheduler = ???; 
var init; 
scheduler.schedule(() => console.log(init)); // does nothing 
init = "Hello"; 
scheduler.start(); // print "Hello" because it was scheduled 
scheduler.schedule(() => console.log(" world!")); // instantly print 
// "world! " because the scheduler is already active. 

ich auch vergessen, wie dies in CS zu nennen, was das wieder genannt wurde?

+0

Sie so etwas wie 'setTimeout() bedeuten' tut ? https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout –

+0

Es kommt darauf an ... Wenn Sie möchten, dass der Scheduler-Callback basierend auf einer bestimmten Zeit abläuft, verwenden Sie setTimeout () wie Yuriy vorschlägt. Wenn Sie es auf Basis eines anderen Ereignistyps erstellen möchten, registrieren Sie es mit dem entsprechenden Ereignishandler. – RJM

+0

Welche JS-Umgebung? – Alnitak

Antwort

3

Ich glaube, was Sie suchen, ist Event-Management. Node.js bietet Event Emitter. Es gibt keine für Browser-JS, aber es gibt viele Bibliotheken, die diese Funktionalität bieten.

const myEmitter = new EventEmitter(); 

myEmitter.on('event',() => { 
    console.log('an event occurred!'); 
}); 

myEmitter.emit('event'); 

Auf der anderen Seite sieht der Code eher wie ein Deferred (einmalige Entschlossenheit, nicht Multi-Trigger). jQuery bietet diese Funktionalität. Mir ist keine native Implementierung bekannt. Der nächste wäre ein Promise, aber Versprechen sind "schreibgeschützt". Sie setzen resolve/reject nach dem Bau nicht frei.

const deferred = $.Deferred(); 

deferred.then(function(){ 
    console.log('the deferred resolved!'); 
}); 

deferred.resolve(); // logs 

// Fires immediately since deferred is already resolved 
deferred.then(function(){ 
    console.log('the deferred resolved already!'); 
}); 
+0

Aber wird dies 1) die erste Schließung nach ".emit" verwerfen. Und 2) feuern Sie sofort jede neue Schließung, die wir planen, nachdem "emit" einmal in der Vergangenheit aufgerufen wurde. – Dorus

+0

@Dorus Aktualisierte Antwort. – Joseph

+0

Danke. Mein Gehirn blockierte irgendwie, ich sehe jetzt, wie ich diese Dinge wieder machen kann. Mir wurde gesagt, dass "$ .Defered()" eigentlich ein altes Schulversprechen ist. Plötzlich sehe ich, wie diese Dinge wieder funktionieren :) – Dorus

1

Dies ist ein Beispiel für einen sehr einfachen Scheduler ohne eine Bibliothek, wenn Sie an einem Konzept suchen mögen, wie das funktionieren könnte

"use strict"; 

class Scheduler { 
    constructor(start) { 
     this.queue = [] 
     this.started = !!start 
    } 

    start() { 
     this.started = true 
     this.execute() 
    } 

    stop() { 
     this.started = false 
    } 

    execute() { 
     while(this.started && this.queue.length > 0) { 
      let fn = this.queue.pop() 
      fn() 
     } 
    } 

    schedule(fn, context) { 
     if (context) { 
      fn = fn.bind(context) 
     } 
     this.queue.push(fn) 
     this.execute() 
    } 
} 

const scheduler = new Scheduler() 
let init 
scheduler.schedule(() => console.log(init)) // does nothing 
init = "Hello" 
scheduler.start() // print "Hello" because it was scheduled 
scheduler.schedule(() => console.log(" world!")) // instantly print 
// "world! " because the scheduler is already active. 
+0

sieht gut aus - ich war in der Mitte, etwas sehr ähnlichen Code zu schreiben. Sie sollten vielleicht berücksichtigen, was passiert, wenn die geplante Funktion asynchron ist? – Alnitak