Node.js事件监听器被阻止?

使用以下代码,我注册了一个node.js事件侦听器,该侦听器正在等待来自通过名为zmqevent的全局nodejs EventEmitter转发的zeromq连接的响应。

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()链? 电stream输出如下所示:

 1 1 1 1 1 1 1 1 event triggered 

基本上我想等待来自我的zeromq连接的响应2秒,并且如果没有响应到达,则激活另外的“离线”结果。 但是即使这个简单的例子还没有起作用,事件只是在我的脚本的最后才被解雇。 你有好主意吗? 显然必须有一个愚蠢的错误…

如果我理解正确,你需要这样的东西:

 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); 

你不能。

NodeJS(和io.js)中的JavaScript并发模型是, 所有同步代码在任何在微/macros任务队列上调度的事件处理程序被排空之前运行。

这只是并发模型的工作方式,实际上非常有用,因为没有中断将代码置于不一致的状态。