2015-04-17 127 views
1

使用以下代碼我註冊了一個node.js事件偵聽器,該偵聽器正在等待來自通過名爲zmqevent的全局nodejs EventEmitter轉發的zeromq連接的響應。Node.js事件監聽器被阻止?

global.zmqevent.removeAllListeners(req.user._id) 
global.zmqevent.on(req.user._id, function (msg, status) { 
     console.log('event triggered'); 
}); 

global.zmq_controller_pub.send(recipient + " " + String(req.user._id) + " " + "getReportSingle"); 

console.log("1"); 
console.log("1"); 
console.log("1"); 
console.log("1"); 
console.log("1"); 
console.log("1"); 
console.log("1"); 
console.log("1"); 

基本上事件隊列起作用。 zmq_controller_pub.send將請求發送到我的外部腳本,並且響應到達node.js發出一個node.js事件,該事件觸發上面定義的事件偵聽器。

我怎樣才能讓事件監聽器在我的腳本結尾處中斷console.log()鏈? 電流輸出是這樣的:

1 
1 
1 
1 
1 
1 
1 
1 
event triggered 

基本上,我想等我從2秒和消防另類「離線」 zeromq連接的響應的結果,如果沒有應答。 但即使這個簡單的例子還沒有工作,事件只在我的腳本的最後被觸發。 你有想法嗎?顯然必須有一個愚蠢的錯誤...

+0

如果要等待2秒,使用'的setTimeout(...,2000)'。當響應在這段時間內到達時,使用'clearTimeout()'來再次取消它。 – robertklep

+0

我不確定你的意思?你能舉一個例子嗎? 看來不可能用事件中斷setTimeout()。 – Whezz

回答

0

如果我理解正確的話,你想是這樣的:

var timeout = null; 
var didRespond = false; 

// Wait for an event 
global.zmqevent.removeAllListeners(req.user._id) 
global.zmqevent.on(req.user._id, function (msg, status) { 
    console.log('event triggered'); 

    // Remove the timeout so it won't trigger the handler anymore. 
    clearTimeout(timeout); 

    // If we already responded (due to the timeout), we don't respond here. 
    if (didResponse) { 
    return; 
    } 

    // Send your response. 
    ... 
}); 

// I think the "removeAllListeners"/"on" combo can be folded into one "once": 
// global.zmqevent.once(req.user._id, ...) 

// Start a timer that triggers in two seconds. 
timeout = setTimeout(function() { 
    // Do the "offline" handling, since it took more than 2 seconds for the 
    // event to arrive. 
    didRespond = true; 
    ... 
}, 2000); 
+0

這就是我一直在尋找的!非常感謝你! – Whezz

4

你不能。

NodeJS(和io.js)中的JavaScript併發模型是所有同步代碼在排除任何在微/ macrotask隊列上調度的事件處理程序之前運行。

這只是併發模型的工作方式,實際上非常有用,因爲永遠不會有中斷將您的代碼置於不一致的狀態。

+0

什麼是正確的方式來「等待」來自外部服務器的響應幾秒鐘而不會阻塞所有事件,即使響應在幾毫秒後到達? 我曾經期待過。例如: function wait()if((gotResponse == false)&&(waitingTime Whezz

+0

@Whezz根本不會阻止 - 如果你有的只有那些'console.log',它只是幾毫秒。永遠不要阻止i.o做異步。如果您需要在CPU上阻塞代碼,將代碼移到子進程中,則您無法在io.js中的主進程中的偵聽器(以及其他方式)中執行嚴重的計算。 –