事件是怎么来的?
发布于 10 年前 作者 songqinghehe 4666 次浏览 最后一次编辑是 8 年前 来自 问答

因本人无js基础,所以在看到有时间.on(‘data’,callback); .on(‘error’,callback);这样的字眼的时候却懵了,error或者data是怎么定义出来的?有相关手册可以查么?

11 回复

@sjfkai 可能我没表达清楚,比如:data ,error是怎么来的?

emitter.emit(event[, arg1][, arg2][, …])# Execute each of the listeners in order with the supplied arguments. Returns true if event had listeners, false otherwise.

emitter.emit('error') 就会触发 emitter.on('error',cb)中的cb

@sjfkai 可能我没表达清楚,加入我传err应该不能识别吧

事件的名字on('foo'),是一种协议(规范),自定义的可以随意其名字,api里的查官方api doc不就行了

源代码,https://github.com/joyent/node/blob/master/lib/events.js node提供两种事件接口,一种是EventEmitter提供的,我们一般on的都是EventEmitter包装过的。还有一种是原生的,接口也是on,但是emit是在c++层面做的,我们一般接触不到,大多都要EventEmitter包装一下的。

想要深入的学习,读源代码,其他的方法都是扯淡,源代码读明白了,自己实现一个,自然就明白了。

@coordcn 我要的答案应该是你说的后者

@songqinghehe https://github.com/joyent/node/blob/master/src/stream_wrap.cc 数据来了OnRead() 数据读完后MakeCallback(),这个过程就是将读取的数据传递给你用on注册的callback,并执行callback。

楼主问的这个问题涉及到js设计模式的pubsub模式 Nodejs的EventEmitter, 就是pubsub的典型栗子 当然你可以自己定义一个。这里写一个很简单的栗子

myPubSub = {
  handlers:{}
}
myPubSub.on = function(event, handler){
  if (!(event in this.handlers)) {
    this.handlers[event] = [];
  }
  this.handlers[event].push(handler);
  return this;
}

myPubSub.emit = function(event) {
  var arg = [].slice.call(arguments, 1);
  for(var i = 0; i< this.handlers[event].length; i++){
    this.handlers[event][i].apply(this, arg);
  }
  return this;
}
回到顶部