2017-03-11 1 views
0

Wenn das Ereignis someevent ausgelöst wird, möchte ich einfach warten, bis das Versprechen gelöst ist, bevor Sie fortfahren. Es dauert jedoch lange, bis slowFunctionThatReturnsPromise aufgelöst wird, und der gesamte Prozess wird beendet, bevor er aufgelöst wird. Daher ist es nie abgeschlossen. Ich hätte gedacht, mit einer then würde warten auf das Versprechen gelöst werden, aber ich kann nicht herausfinden, warum es nicht warten.Warten Sie, bis das Versprechen in einer emitter.on-Listener-Funktion aufgelöst wird

emitter.on('someevent', listener) 


var listener = function() 
{ 
    x.slowFunctionThatReturnsPromise() 
     .then(function() 
     { 
      console.log('done'); 
     }) 
} 
+0

* Warten * und * asynchron * sind Dinge, die einander entgegengesetzt sind. * Der * synchrone * Code hält den Prozess beschäftigt, bevor er mit einem anderen Code im selben Aufrufstapel fortfährt, während der * asynchrone * Code nur * aufgerufen wird, nachdem * der gerade laufende Aufrufstapel abgeschlossen ist. – trincot

+0

Ich brauche das Versprechen von 'slowFunctionThatReturnsPromise' gelöst werden, bevor die' Listener' Funktion – jmccure

+1

'' dann 'Callbacks asynchron ausgeführt werden, so von Natur aus (und Absicht) verspricht solche Rückrufe * nicht * vor der Rückkehr ausgeführt werden das Versprechen, aber nachdem der aktuelle Code-Task abgeschlossen ist. Also: nicht möglich. – trincot

Antwort

1

Sie es nicht auf "exit" Ereignis tun, die node.js beschreibt

Listener-Funktionen nur synchrone Operationen durchführen müssen. Der Prozess Node.js wird unmittelbar nach dem Aufruf des Exit-Ereignisses listeners beendet, wodurch zusätzliche Arbeit in der Ereignisschleife abgebrochen wird. Im folgende Beispiel zum Beispiel auftreten, das Timeout nie:

https://nodejs.org/dist/latest-v7.x/docs/api/process.html#process_event_exit

Sie obwohl anmutiges Kill-Signal verarbeiten können und dann den Prozess beenden, wenn Sie bereit sind.

process.on('SIGINT',() => { 
    x.slowFunctionThatReturnsPromise().then(function() { 
     process.exit(0); 
    }) 
}); 
+0

Entschuldigung, ich benutzte Exit als (schlechtes) Beispiel, der Event-Name ist eigentlich etwas anderes – jmccure

+1

Ok. In diesem Fall können Sie dies auch nicht tun, da die Listener im Standard-EventEmitter synchron sind. Dieser Ereignissender könnte für Sie besser sein. https://www.npmjs.com/package/async-eventemitter – wookieb

+0

danke für den Link, das würde sicherlich funktionieren, aber leider ist der Event-Emitter, in dem ich arbeite, innerhalb von Mokka, und ich möchte Mocha https nicht ändern: //www.npmjs.com/package/mocha – jmccure

0

Vermissen Sie ein return vor x.slowFunctionThatReturnsPromise()?

+0

Ja, aber Knoten 'EventEmitter's ist es egal, was die Listener zurückgeben, so dass dies das Verhalten nicht beeinflusst. – Bergi

Verwandte Themen