我想使用类中的方法作为socketio回调。调用的方法仍应具有与套接字关联的"this"以及类变量的"this"。
最终,这样我就可以使用 this.id 作为套接字 ID,以及使用 io 向所有连接的套接字发出。我经历了很多类似的问题,但找不到一个明确的(对我来说)解决方案。
/index.js
const test = require('./modules/testClass.js');
test.init("some string");
io.on('connection', function(socket) {
socket.on('login', test.saySomething)
})
/testClass.js
class Test {
init(someString) {
this.theString = someString;
}
saySomething() {
console.log(this.theString);
}
}
module.exports = new Test();
在这个简单的示例中,它应该打印"一些字符串",但也能够访问套接字 ID。 谢谢!
更新:我能够像这样完成它:
io.on('connection', function(socket) {
socket.on('login', (username) => tables.testit(socket, username))
})
testit(socket, username) {
console.log(socket.id + " " + username);
}
这不是很漂亮,这还是好习惯吗?
不确定您是否可以同时维护这两个上下文,但我解决此问题的方法是在 socket.io 回调中使用bind
。所以socket.on('loging', test.saySomething.bind(test))
现在,如果您还希望您的套接字实例在您的类中,您可以将其作为参数传递给 saySomething(socket)
.在回调中,这将变为socket.on('loging', test.saySomething.bind(test, socket))
。
附带说明一下。如果可以使用内置构造函数,为什么要使用 init 函数?