寻求解答,关于nodejs的event触发!
发布于 3年前 作者 coldsolo 2068 次浏览
今天尝试写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 回复

没人给解答一下!谢谢

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

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

在回调时,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对象。

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

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

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

回到顶部