2012-02-09 61 views
0

我調用了一個函數,它可以堆棧兩個異步調用並在它們都完成時調用回調。
我正在使用一種非常簡單的方法來跟蹤尚未完成的調用

lock ++
lock -

問題是程序在兩個函數的操作完成之前退出。我注意到這是我調試時遇到的問題,並在退出之前讓流程完成。

我該如何解決這個問題? (此刻我在一個位上如何準確解釋我的問題,請叫我什麼,你需要這樣我就可以澄清問題的損失)節點JS過早程序結束

-----編輯

隨着腳本下面爲什麼當我運行它只是退出?我認爲通過調用我註冊到事件隊列並且腳本應該繼續運行?

var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 

eventEmitter.on('spo',function(){ 
console.log('spo'); 
}); 
+8

發佈一些示例代碼? – jergason 2012-02-09 02:25:42

+1

您可以嘗試使用https://github.com/caolan/async。做同樣的事情。 – 2012-02-09 03:18:53

回答

0

COMING From a Git Hub thread.

是什麼讓事件循環活着手柄(插座,定時器等)的腳本都沒有。

EventEmitter實例是同步的 - 也就是說,它們立即運行 - 因此在您的示例中,一旦事件觸發,腳本就完成了。

認爲它是這樣的:本身就是一個EventEmitter是沒有用的,當它綁的東西,發出有趣 事件(從網絡或文件系統中, 到期定時器數據只 變得有用,等等。)。

我認爲他們所說的是,它是節點之外的控制檯,將C腳本打開。

0

問題是,你設置了一個事件發射器並附加一個處理程序到「spo」事件,然後你什麼都不做。所以節點運行時間看到沒有什麼可以做和退出了。試試這個:

eventEmitter.on('spo', function() { 
    console.log('OK: got event "spo"'); 
}); 
eventEmitter.emit('spo'); 
+0

它運行回調然後仍然退出。我理解它的方式是,只要有一個註冊監聽器,事件循環就不會退出!如果我想要某些功能類似於http.listen(),該怎麼辦?這使腳本繼續運行。 – Prospero 2012-02-09 20:07:54

+0

setInterval(function(){},500);將保持運行,但我覺得這不應該需要。 – Prospero 2012-02-09 20:11:32

+0

@JamesAndino:對,如果你使用'setInterval()',那麼節點知道某些東西可能在將來發出事件,因爲事件隊列中有東西;但是,當事件隊列爲空時,它只是退出。我想像'httpServer.listen()'這樣的函數向事件隊列中添加一個「永久」條目,以便節點不會退出,但不確定具體細節。 – maerics 2012-02-09 20:20:49