TypeError:this.sendHandshake不是函数

时间:2017-12-08 21:53:12

标签: node.js socket.io

我试图为nodejs&创建一个简单的类(包装器)。 socket.io游戏。

module.exports = class client {
constructor(socket) {
    this.socket = socket;
    this.createEvents();
}

createEvents() {
    console.log('creating events');
    this.socket.on('handshake', this.onHandshake);
    this.socket.on('disconnect', this.onDisconnect);
}

sendHandshake() { // <------------ sendHandshake is there?
    console.log('sending handshake');
    this.socket.emit('handshake');
}

onHandshake() {
    console.log('handshake received');
    this.sendHandshake(); // <----- TypeError: this.sendHandshake is not a function
}

onDisconnect() {
    console.log('client disconnected');
}
}

它应该给我这个输出

creating events
handshake received
sending handshake

但它给了我这个错误

creating events
handshake received
TypeError: this.sendHandshake is not a function

1 个答案:

答案 0 :(得分:0)

传递函数时,它不会自动绑定到拥有该函数的对象。一个更简单的例子是:

const EventEmitter = require('events');
class client {
    constructor() {
        this.ev = new EventEmitter;
        this.ev.on('handshake', this.onHandshake);
        this.ev.emit('handshake');
    }

    onHandshake() {
        console.log(this); // EventEmitter
    }
}

相反,您必须将函数绑定到client,只需使用this.onHandshake.bind(this)() => this.onHandshake()即可轻松完成。前者明确绑定this。后者在词汇上绑定this,即this在函数中定义的位置。

我还要指出,您通过发出handshake来回复handshake - 不确定是否有意或需要。