2016-05-20 13 views
1

我有一個Node應用程序正在執行一些異步事件,並且我不能冒險出現這種情況,因爲許多模塊中的一個模塊發生了一些不好的事情,所以應用程序永遠不會退出。 (這只是在發送日誌消息到服務時發生的。)在事件循環爲空或在超時後退出Node.js進程

我不能直接使用process.exit,因爲無論有多少異步操作掛起,它都會終止。不過我想盡早退出,所以這不會做:

function exit() { 
    setTimeout(function() { 
     process.exit(1); 
    }, 10000); 
} 

因爲這會等待10秒,即使一切正常,所有異步事件1秒後結束。

我在考慮檢查事件循環是否爲空,除了這個定時器,然後退出。這可能可以通過undocumented process methods來完成,但我更喜歡避免那樣的黑幕。任何關於解決這個問題的更好方法的想法?

回答

3

您可以將您的計時器設置爲任何您希望超時持續時間爲「卡住」的異步操作。

然後.unref() the timer。這將保持計時器本身不會使node.js退出,因此當所有的異步操作完成或計時器觸發時(以先到者爲準),它將退出。

function exit() { 
    var t = setTimeout(function() { 
     process.exit(1); 
    }, 10000); 
    // allow process to exist naturally before the timer if it is ready to 
    t.unref(); 
} 

有個聲音告訴我,一個更加可控和穩健的解決方案將是更有力代碼放在每個單獨的異步事件。可以像外部服務器的HTTP請求一樣卡住的事物有各自的超時設置,因此如果您設置了它們,那麼它們將自行完成一種或另一種方式,並且您不會冒着外部風險計時器可能會在異步操作完成時觸發,甚至沒有卡住,但速度很慢。

+0

關於健壯編碼的好處,然而在這種情況下,問題是WebSocket連接無限期地保持打開,除非明確地關閉它,所以我沒有任何機會。 – ciscoheat

+0

@ciscoheat - 爲什麼不直接在webSocket連接上實現一個超時,如果這就是你真正想要的? – jfriend00

+0

這是私人的(在第三部分模塊中),我沒有訪問它並且不想破解它。 – ciscoheat