跳到主要内容
CNode

寻求解答,关于nodejs的event触发!

社区
Ccoldsolo发布于 14 年前最后回复 14 年前
563690
今天尝试写node代码了,碰到了一个问题。感觉一些原理还没有掌握。请帮忙解答,并多少阐述些出现此种问题的原理


仅仅是简单示例:(时间关系,代码细节错误和事件继承的代码不写了,抓主要问题)
//文件server.js 
var connect = require('./connect.js');
var http = require('http');

function Server(){
     this.httpServer = new http.server();
     this.socket = 0 ;
}

Server.prototype.createServer(){
     this.httpServer.on('upgrade",function(req,socket,upgradeHead){
         this.socket = socket ;
         var connect = new connect(this.socket);
     })
}


//文件connect.js

fucntion connect(sock){
    this.socket = sock ;
    this.isLogin = false ;
    this.init();
}

connect.prototype.init(){
    /*问题出现在下面这个函数!!我想绑定这个on data,在回调函数中 我可不可以用this.isLogin,如   果不行为什么 ,如果行,为什么,怎样解决这样的问题,如果回调的function中只有this,代表谁?谢谢 */  
   this.socket.on('data',function(data){
         if(this.isLogin == false)
             {
               checkLogin(data);
              }
         else
          { 
               dispatch(data);
          }
     })
}


查看回复

回复 (5)

D
dead-horse#514 年前

LS说的无误,传入的匿名函数内部的thissoket对象。
如果想指定这个函数的this对象,可以这样做:

this.socket.on('data', function(data) { // handle here }.bind(this));

J
jackliu8722#414 年前

在回调时,this应该指向了socket对象,socket应该是EventEmitter子类的一个对象,在EventEmitter.prototype.emit方法中,有这样一段代码: var handler = this._events[type]; if (!handler) return false;

if (typeof handler == 'function') { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: var l = arguments.length; var args = new Array(l - 1); for (var i = 1; i < l; i++) args[i - 1] = arguments[i]; handler.apply(this, args); } return true;

} else if (isArray(handler)) { var l = arguments.length; var args = new Array(l - 1); for (var i = 1; i < l; i++) args[i - 1] = arguments[i];

var listeners = handler.slice();
for (var i = 0, l = listeners.length; i < l; i++) {
  listeners[i].apply(this, args);
}
return true;

} else { return false; } 代码中的type便是楼主程序中的data事件,handler就是楼主写的回调函数,在回调函数执行时,是这样调用的handler.apply(this,....),this便是EventEmitter的一个对象,也可是其子类的一个对象,但在这里,this便是楼主的socket对象,因此回调函数中的this便是socket对象。

仅仅是个人理解,理解错了,请指正,欢迎高手们指正错误。

C
coldsolo#314 年前

改了排版,会不会有人帮忙

J
jiyinyiyong#214 年前

这边是有点冷清.. 等等吧,, 顺便整下 markdown 那个蛋疼的代码排版

C
coldsolo#114 年前

没人给解答一下!谢谢

参与回复

登录后即可参与回复。登录