在回调中使用javascript nodejs类方法并保留两个上下文



我想使用类中的方法作为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 函数?

最新更新