Использование метода класса javascript nodejs в обратном вызове и сохранение обоих контекстов - PullRequest
0 голосов
/ 23 января 2019

Я хочу использовать метод из класса в качестве обратного вызова socketio.Вызываемый метод должен по-прежнему иметь «this», связанный с сокетом, а также «this» для переменных класса.

В конечном счете, так я могу использовать this.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();

В этом простом примере он должен вывести «некоторую строку», но также иметь возможность доступа к идентификатору сокета.,Спасибо!

Обновление: я смог сделать это следующим образом:

io.on('connection', function(socket) {
  socket.on('login', (username) => tables.testit(socket, username))
})

testit(socket, username) {
  console.log(socket.id + " " + username);
}

Это не очень красиво, это все еще хорошая практика?

1 Ответ

0 голосов
/ 23 января 2019

Не уверен, что вы можете поддерживать оба контекста, но я решил бы эту проблему, используя bind в вашем обратном вызове socket.io.Так что socket.on('loging', test.saySomething.bind(test)) Теперь, если вам также нужен экземпляр вашего сокета в вашем классе, вы можете передать его в качестве аргумента saySomething(socket).В обратном вызове это станет socket.on('loging', test.saySomething.bind(test, socket)).

На примечании стороны.Зачем использовать функцию init, если вы можете использовать встроенный конструктор?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...