2017-03-11 45 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