以下是我的nodejs代码
var emitter = require('events'),
eventEmitter = new emitter.EventEmitter();
eventEmitter.on('data', function (result) { console.log('Im From Data'); });
eventEmitter.on('error', function (result) { console.log('Im Error'); });
require('http').createServer(function (req, res) {
res.end('Response');
var start = new Date().getTime();
eventEmitter.emit('data', true);
eventEmitter.emit('error', false);
while(new Date().getTime() - start < 5000) {
//Let me sleep
}
process.nextTick(function () {
console.log('This is event loop');
});
}).listen(8090);Nodejs是单线程的,它在eventloop中运行,同一个线程为事件提供服务。因此,在上面的代码中,对我的localhost:8090节点线程的请求应该保持忙于服务请求,有5秒的休眠。
同时,eventEmitter还发出了两个事件。因此,一旦请求得到服务,这两个事件都必须在eventloop中排队以进行处理。
但这并没有发生,我可以看到事件在发出时被同步服务。
这是意料之中的吗?我明白,如果它像我预期的那样工作,那么就没有必要扩展events模块了。但是如何处理eventEmitter发出的事件呢?
发布于 2012-05-17 23:28:40
只有需要异步处理的内容才会被推送到事件循环中。节点中的标准事件发射器将立即分派事件。只有使用process.nextTick、setTimeout、setInterval之类的代码,或者在C++中显式添加的代码才会影响事件循环,比如节点的库。
例如,当您将节点的fs库用于createReadStream之类的内容时,它会返回一个流,但会在后台打开文件。当它打开时,节点会添加到事件循环中,当循环中的函数被调用时,它将在流对象上触发“open”事件。然后,节点将在后台加载文件中的块,并添加到事件循环中以触发流上的data事件。
如果您希望这些事件在5秒后发出,则需要使用setTimeout或将emit调用放在繁忙循环之后。
我还想说清楚,你不应该在Node代码中有一个像那样的繁忙循环。我不知道你这样做是为了测试事件循环,还是它是一些真实代码的一部分。如果您需要更多信息,请对您希望实现的功能进行扩展。
https://stackoverflow.com/questions/10637418
复制相似问题