2016-04-10 3 views
2

Ich bin sehr neu in JavaScript und NodeJS, ich habe nur versucht, das Emittermuster in NodeJS zu verstehen. Wenn ich versuche, jede Sekunde ein Tick Ereignis zu emittieren, die setInterval-Funktion scheint das Programm zu arbeiten fein: -Ereignisse in NodeJS, Ereignis wird ausgegeben, innerhalb von setInterval, aber nicht ohne setInterval

 var util = require('util'), 
     EventEmitter = require('events').EventEmitter; 

     var Ticker = function() { 
      var self = this; 
      setInterval(function() { 
      self.emit('tick'); 
      }, 1000); 
     }; 

     util.inherits(Ticker, EventEmitter) 

     var ticker = new Ticker(); 
     ticker.on('tick', function() { 
      console.log('TICK'); 
     }); 

Aber, wenn ich versuche, ein Ereignis zu emittieren, ohne die setInterval Methode, mein Fall ist nicht genannt zu werden: -

 var util = require('util'), 
      EventEmitter = require('events').EventEmitter; 

     var Ticker = function() { 
      var self = this; 
      self.emit('tick'); 
     }; 

     util.inherits(Ticker, EventEmitter) 

     var ticker = new Ticker(); 
     ticker.on('tick', function() { 
      console.log('TICK'); 
     }); 

Bitte helfen Sie, ich verstehe nicht, wo ich falsch bin ... soweit mein Verständnis, wenn self.emit genannt wird, ticker.on nicht registriert ist, und damit die Ereignis wird verpasst. Wenn dies der Fall ist, wie gebe ich ein Ereignis aus, wenn ein Objekt erstellt wird.

+0

Tipp: Wenn Sie erben, sollten Sie den übergeordneten Konstruktor in Ihrem Konstruktor aufrufen, falls er eine eigene Initialisierung durchführen muss. In diesem speziellen Fall würde das bedeuten, 'EventEmitter.call (this);' innerhalb Ihrer Konstruktorfunktion ('Ticker()') hinzuzufügen. – mscdex

+0

Hallo, ich habe versucht, mit Ihrem Tipp, im Konstruktor, zeigte es einen Fehler, der sagt, dass ticker.on keine Funktion ist –

Antwort

0

JavaScript ist eine (meist *) synchrone Sprache, wenn nicht anders angegeben, wird Code von oben nach unten ausgeführt, und nur asynchrone Ereignisse werden für später in die Warteschlange gestellt.

Ohne die setInterval später die emit() zum Einreihen, haben Sie so etwas wie diese:

create Ticker 
Ticker.emit() 
Ticker.on(...) 

Also im Grunde ist nun mal die .emit() synchron, und vor dem ersten Aufruf zu .on().


* Vor allem, weil mit ES2015 wir Promises haben, die eine Sprachebene konstruieren sind für etwas asynchron zu beschreiben, das ist nicht wichtig, aber für das Problem beobachten Sie.

+0

Ok, danke für Ihre Antwort, aber was soll ich tun, wenn ich ein Ereignis ausstrahlen muss, Wann wird mein Objekt erstellt? –

+0

Verwenden Sie 'setTimeout (() => this.emit(), 0)' oder etwas ähnliches, um sicherzustellen, dass es asynchron ausgegeben wird. –

+0

Ok, vielen Dank –

1

wie kann ich ein Ereignis ausgegeben wird, wenn ein Objekt erstellt wird

Sie kennen die Antwort bereits. Hören Sie sich dieses Ereignis an, bevor Sie es auslösen. Es gibt keine anderen Lösungen. Asynchron feuern emit ist nur ein Messier. Außerdem empfehle ich nicht, ES5 auf nodejs zu schreiben.

let Event = require('event'); 
class Ticker extends Event{ 
    constructor(){ 
     super(); 
     this.on('tick',() => { 
      console.log('TICK'); 
     }); 
     this.emit('tick'); 
    } 
} 
new Ticker(); 

// or better 
class Ticker extends Event{ 
    constructor(){ 
     super(); 
    } 
} 
var ticker = new Ticker(); 
ticker.on('tick',() => { 
    console.log('TICK'); 
}); 
ticker.emit('tick');