Nodejs事件处理

以下是我的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是单线程的,它运行在一个事件callback中,同一个线程为事件提供服务。 所以,在上面的代码中对本地主机的请求:8090节点线程应该保持忙碌服务请求[有5秒的睡眠时间]。

同时eventEmitter发出两个事件。 所以,这两个事件都必须在请求服务之后在事件callback中排队进行处理。

但是这并没有发生,我可以看到这些事件在发射的同时被同步服务。

这是预期的吗? 我明白,如果它按我期望的那样工作,那么就不会使用扩展事件模块。 但eventEmitter发出的事件是如何处理的?

只有需要asynchronous处理的东西被推入事件循环。 节点中的标准事件发射器将立即发送一个事件。 只有使用诸如process.nextTicksetTimeoutsetInterval或者以C ++显式添加的代码的代码才会影响事件循环,就像节点的库一样。

例如,当你使用节点的fs库来创build类似于createReadStream东西时,它会返回一个stream,但是在后台打开这个文件。 打开时,节点添加到事件循环中,当循环中的函数被调用时,它将触发stream对象上的“打开”事件。 然后,节点将在后台加载文件中的块,并添加到事件循环中以触发stream中的data事件。

如果你想在5秒后发射这些事件,你可能会想要使用setTimeout或者在忙循环之后放置呼叫。

我也想清楚一点,你不应该像Node代码那样有一个繁忙的循环。 我不知道你是否只是在testing事件循环,或者它是否是一些真正的代码的一部分。 如果您需要更多的信息,请扩展您正在寻找的function。