Saturday, November 22, 2014

动态语言把我绕晕了

发信人: nirvanaws (xboh), 信区: Programming
标  题: 动态语言把我绕晕了--javascript
发信站: BBS 未名空间站 (Thu Oct 10 02:53:34 2013, 美东)

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);



--

※ 修改:·nirvanaws 於 Oct 10 03:10:29 2013 修改本文·[FROM: 76.]
※ 来源:·WWW 未名空间站 海外: mitbbs.com 中国: mitbbs.cn·[FROM: 76.]

http://www.mitbbs.com/article_t/Programming/31271731.html

No comments:

Post a Comment