2017-03-11 13 views
0

当触发someevent事件时,我只想在继续之前等待承诺解决。但slowFunctionThatReturnsPromise需要很长时间才能解决,整个过程在解决之前会关闭。因此它从未完成。我本来以为使用then会等待承诺解决,但我不明白为什么它不会等待。等待承诺解析到emitter.on侦听器函数

emitter.on('someevent', listener) 


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

*等待*和*异步*是彼此相反的东西。 *在同一个调用堆栈中继续执行任何其他代码之前,同步*代码将保持进程繁忙,而*异步*代码仅在当前正在运行的调用堆栈完成后才被调用*。 – trincot

+0

我需要'slowFunctionThatReturnsPromise'返回的promise在退出'listener'函数之前得到解决 – jmccure

+1

'then'回调函数是异步执行的,所以根据承诺的性质(和意图),这些回调函数将不会在返回之前被执行承诺,但在当前代码任务完成之后。所以:不可能。 – trincot

回答

1

你不能做到这一点的“退出”事件,Node.js的介绍

监听功能只能执行同步操作。 Node.js进程在调用'exit'事件 侦听器后会立即退出,导致放弃在事件循环 中排队的任何其他工作。在下面的例子中,例如,将永远不会发生超时 :

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

你可以尽管处理优美kill信号,然后当你准备好退出的过程。

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

道歉,我使用退出作为(坏)的例子,事件名称实际上是别的 – jmccure

+1

好的。在这种情况下,你不能这样做,因为标准EventEmitter中的监听器是同步的。这个事件发射器可能对你更好。 https://www.npmjs.com/package/async-eventemitter – wookieb

+0

谢谢你的链接,这肯定会工作,但不幸的是我正在工作的事件发射器是在摩卡内,我不想修改摩卡https: //www.npmjs.com/package/mocha – jmccure

0

您是否错过x.slowFunctionThatReturnsPromise()前面的return

+0

是的,但节点'EventEmitter'不关心听众返回什么,所以这不会影响行为。 – Bergi