首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs事件处理

Nodejs事件处理
EN

Stack Overflow用户
提问于 2012-05-17 22:14:52
回答 1查看 3.5K关注 0票数 4

以下是我的nodejs代码

代码语言:javascript
复制
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发出的事件呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-17 23:28:40

只有需要异步处理的内容才会被推送到事件循环中。节点中的标准事件发射器将立即分派事件。只有使用process.nextTicksetTimeoutsetInterval之类的代码,或者在C++中显式添加的代码才会影响事件循环,比如节点的库。

例如,当您将节点的fs库用于createReadStream之类的内容时,它会返回一个流,但会在后台打开文件。当它打开时,节点会添加到事件循环中,当循环中的函数被调用时,它将在流对象上触发“open”事件。然后,节点将在后台加载文件中的块,并添加到事件循环中以触发流上的data事件。

如果您希望这些事件在5秒后发出,则需要使用setTimeout或将emit调用放在繁忙循环之后。

我还想说清楚,你不应该在Node代码中有一个像那样的繁忙循环。我不知道你这样做是为了测试事件循环,还是它是一些真实代码的一部分。如果您需要更多信息,请对您希望实现的功能进行扩展。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10637418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档