Node.js 事件侦听器被阻止?
Node.js event listener blocked?
使用以下代码,我注册了一个 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() 链?
当前输出如下:
1
1
1
1
1
1
1
1
event triggered
基本上我想等待 zeromq 连接的响应 2 秒,如果没有响应到达则触发和替代 "offline" 结果。
但即使是这个简单的示例也无法正常工作,并且事件仅在我的脚本的最后触发。
你有好主意吗?显然一定是犯了一个愚蠢的错误...
你不能。
JavaScript 在 NodeJS(和 io.js)中的并发模型是 所有同步代码 在 micro/macrotask 队列已排空。
这正是并发模型的工作方式,它实际上非常有用,因为永远不会出现使您的代码处于不一致状态的中断。
如果我没理解错的话,你想要这样的东西:
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);
使用以下代码,我注册了一个 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() 链? 当前输出如下:
1
1
1
1
1
1
1
1
event triggered
基本上我想等待 zeromq 连接的响应 2 秒,如果没有响应到达则触发和替代 "offline" 结果。 但即使是这个简单的示例也无法正常工作,并且事件仅在我的脚本的最后触发。 你有好主意吗?显然一定是犯了一个愚蠢的错误...
你不能。
JavaScript 在 NodeJS(和 io.js)中的并发模型是 所有同步代码 在 micro/macrotask 队列已排空。
这正是并发模型的工作方式,它实际上非常有用,因为永远不会出现使您的代码处于不一致状态的中断。
如果我没理解错的话,你想要这样的东西:
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);