我想使用类中的方法作为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);
}
这不是很漂亮,这还是很好的做法吗?
答案 0 :(得分:0)
不确定是否可以同时维护两个上下文,但是我要解决此问题的方法是在socket.io回调中使用bind
。所以socket.on('loging', test.saySomething.bind(test))
现在,如果您还希望在类中使用套接字实例,则可以将其作为参数传递给saySomething(socket)
。在回调中,它将变为socket.on('loging', test.saySomething.bind(test, socket))
。
在旁注。如果可以使用内置构造函数,为什么还要使用init函数?