Мутация обратного вызова внутри сообщения
Так что я столкнулся с некоторыми странностями Javascript, если я напишу такую функцию, мой пройденный обратный вызов работает нормально
messageHandler(callback) {
this.ws.onmessage = (data) => {
callback(data.data);
};
}
Если ты пишешь так
messageHandler(callback) {
this.ws.on('message', (data) => {
callback(data);
});
}
Он преобразует обратный вызов в событие сообщения, которое я не могу понять почему, но я хотел бы понять это поведение, если кто-нибудь может объяснить. Заранее спасибо.
1 ответ
Я думаю, что вопрос опускает важную информацию, но, основываясь на примерах кода, я думаю, что вы используете реализацию https://github.com/websockets/ws, правильно?
Если так, то .ws.on('message', ...
относится к слушателю Event Emitter. Параметры, передаваемые вашему обработчику, - это сообщение, поток или любой другой объект данных, излучаемый эмиттером.
.ws.onmessage
ссылается на Websocket API браузера - поэтому переданный параметр есть MessageEvent. Как вы можете видеть из спецификации, data
это свойство на MessageEvent
класс, который объясняет, почему вы должны ссылаться с 1 уровнем косвенности как data.data
,
Возможно, было бы менее запутанным, если бы вы назвали свой параметр event
вместо данных в первом примере:
this.ws.onmessage = (event) => {
callback(event.data);
};
Вы также можете рассматривать это как события на стороне сервера по сравнению с событиями на стороне клиента - ваш первый пример - это событие на стороне клиента, тогда как второй пример - это событие на стороне сервера. События на стороне клиента соответствуют API Websockets, тогда как события на стороне сервера, в мире NodeJS, обычно используют источники событий.