因本人无js基础,所以在看到有时间.on(‘data’,callback); .on(‘error’,callback);这样的字眼的时候却懵了,error或者data是怎么定义出来的?有相关手册可以查么?
@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;
}
@struCoder 多谢
http://www.mirana.me/blog/551c3db1e1382344eba6393c 写过分析eventemitter的东西。