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

时间:2019-01-23 03:44:56

标签: javascript node.js javascript-objects

我想使用类中的方法作为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);
}

这不是很漂亮,这还是很好的做法吗?

1 个答案:

答案 0 :(得分:0)

不确定是否可以同时维护两个上下文,但是我要解决此问题的方法是在socket.io回调中使用bind。所以socket.on('loging', test.saySomething.bind(test)) 现在,如果您还希望在类中使用套接字实例,则可以将其作为参数传递给saySomething(socket)。在回调中,它将变为socket.on('loging', test.saySomething.bind(test, socket))

在旁注。如果可以使用内置构造函数,为什么还要使用init函数?