我无法弄清楚为什么我不能让我的服务器运行emit函数。
这是我的代码:
myServer.prototype = new events.EventEmitter;
function myServer(map, port, server) {
...
this.start = function () {
console.log("here");
this.server.listen(port, function () {
console.log(counterLock);
console.log("here-2");
this.emit('start');
this.isStarted = true;
});
}
listener HERE...
}
听众是:
this.on('start',function(){
console.log("wtf");
});
所有控制台类型都是:
here
here-2
知道它为什么不打印'wtf'
?
答案 0 :(得分:15)
好吧,我们错过了一些代码,但我很确定this
回调中的listen
不会是您的myServer
对象。
您应该在回调之外缓存对它的引用,并使用该引用...
function myServer(map, port, server) {
this.start = function () {
console.log("here");
var my_serv = this; // reference your myServer object
this.server.listen(port, function () {
console.log(counterLock);
console.log("here-2");
my_serv.emit('start'); // and use it here
my_serv.isStarted = true;
});
}
this.on('start',function(){
console.log("wtf");
});
}
...或bind
回调的外部this
值...
function myServer(map, port, server) {
this.start = function () {
console.log("here");
this.server.listen(port, function () {
console.log(counterLock);
console.log("here-2");
this.emit('start');
this.isStarted = true;
}.bind( this )); // bind your myServer object to "this" in the callback
};
this.on('start',function(){
console.log("wtf");
});
}
答案 1 :(得分:0)
对于新手,请确保在可以将“ this”的上下文绑定到函数上时使用ES6 arrow function。
// Automatically bind the context
function() {
}
() => {
}
// You can remove () when there is only one arg
function(arg) {
}
arg => {
}
// inline Arrow function doesn't need { }
// and will automatically return
function(nb) {
return nb * 2;
}
(nb) => nb * 2;