请问EventEmitter的事件是异步执行吗?
发布于 12小时前 作者 defuyun 103 次浏览 来自 问答

https://cnodejs.org/topic/55321e571b9662da568db8c2 看了这篇帖子 回复里有提到EventEmitter实现异步 请问具体是怎么做到的 ----------------------------------- var util = require(“util”); var events = require(“events”);//EventEmitter通过events模块来访问 function asyncEvent() {//新建一个类 events.EventEmitter.call(this); } util.inherits(asyncEvent, events.EventEmitter);//使这个类继承EventEmitter asyncEvent.prototype.log = function(data) {//定义一个新方法 this.emit("data", data);//在此触发名为"data"事件 console.log(‘Hi’); } var s = new asyncEvent(); s.on("data", function(data,callback) {//注册监听器,监听名为"data"事 for(var i = 0; i < 1000000; i++); console.log(‘Received data: "’ + data + ‘"’); }); s.log(“Hi”); // Received data: "It works!"ss ----------------------------------- 比如上面这篇代码 我执行log, 然后log执行里面的emit, 但是我发现代码执行时里面那个console.log(“Hi”)比emit要后执行 也就是说他是等待emit执行完了再执行的. 请问如果我想让事件异步执行该怎么做,谢谢

4 回复

你先把 ‘Hi’ 改成不一样的把,不然怎么区分啊?

@russj 命令行输出是 Recieved data: “Hi” Hi 还是很好区分的

你可以使用 nextTick EventEmitter 的 emit 其实是同步的 另外一点,如果有多个 callback 添加到监听器,最终会按照添加的顺序执行

var util = require('util');
var events = require('events');

function eventEmitter() {
    events.EventEmitter.call(this);
}

util.inherits(eventEmitter, events.EventEmitter);

var ee = new eventEmitter();
ee.on('data', function(data) {
    process.nextTick(function(){
      console.log(data);
    });
});

ee.emit('data', 'f1');

console.log('f2');

如果不介意的话可以看下我的一篇博客

回到顶部