Node in Action 的例子代码 讲emitter的
关于这一行
this.on('broadcast', this.subscriptions[id]);
我是不是可以理解成
1. 当channel.emit('join', id, client)时候,'broadcast' event被注册(to be
listened by channel object)
2. 当channel.emit('broadcast', id, data)时候,'broadcast'被emit,因为channel
一直在listen这个event,从而invoke 'this.subscriptions[id]'
3. 实参id, data替换了this.subscriptions[id]里面的形参[senderId, message],函
数可以执行
4. 尽管函数this.subscriptions[id]体内的变量:id并非形参,因为语言是动态的,所
以在执行时候 函数”this.
subscriptions[id]“是知道id的值的,所以函数可以正确执行?
是在觉得怪怪的,请教一下大家。
另外,到底怎么实现广播的呢?肯定是因为每个join的client都在listen 'broadcast'
event,但是从这个写法上看
this.on('broadcast', this.subscriptions[id]);
this 是代表channel object, 很明显channel object只有一个,所有的client都在它
的clients field下面。所以,并不是client listen'broadcast' event, 只有channel
在listen, 似乎因为每个client都join了, 所以这个'broadcast' event被channel关
联到了多个函数上(每个函数都是’this.subscriptions[id]‘),所以在得到'
broadcast'事件时候,所有注册过的函数(this.subscriptions[id]函数族)都被
invoke了。
是这样实现广播的么? 我的理解感觉很靠不住。
var events = require('events')
, net = require('net');
var channel = new events.EventEmitter();
channel.clients = {};
channel.subscriptions = {};
channel.on('join', function(id, client) {
this.clients[id] = client;
this.subscriptions[id] =
function(senderId, message) {
if (id != senderId) {
this.clients[id].write(message);
}
}
this.on('broadcast', this.subscriptions[id]);
});
var server = net.createServer(
function (client) {
var id = client.remoteAddress + ':' + client.remotePort;
client.on('connect',
function() {
channel.emit('join', id, client);
});
client.on('data', function(data) {
data = data.toString();
channel.emit('broadcast', id, data);
});
});
server.listen(8888);