Мутация обратного вызова внутри сообщения - PullRequest
0 голосов
/ 01 ноября 2018

Так что я столкнулся с какой-то странностью Javascript, если я напишу такую ​​функцию, мой пройденный обратный вызов работает нормально

messageHandler(callback) {
    this.ws.onmessage = (data) => {
        callback(data.data);
    };
}

Если вы напишите так

messageHandler(callback) {
    this.ws.on('message', (data) => {
        callback(data);
    });
}

Он преобразует обратный вызов в событие сообщения. Я не могу понять, почему, но я хотел бы понять это поведение, если кто-нибудь сможет объяснить. Заранее спасибо.

1 Ответ

0 голосов
/ 03 ноября 2018

Я думаю, что вопрос опускает важную информацию, но, основываясь на примерах кода, я думаю, что вы используете https://github.com/websockets/ws реализацию, верно?

Если это так, то .ws.on('message', ... относится к прослушивателю отправителя событий . Параметры, передаваемые вашему обработчику, - это сообщение, поток или любой другой объект данных, излучаемый эмиттером.

.ws.onmessage относится к браузеру Websocket API - поэтому переданный параметр имеет значение MessageEvent . Как видно из спецификации, data - это свойство класса MessageEvent, которое объясняет, почему вы должны ссылаться с 1 уровнем косвенности как data.data.

Возможно, было бы менее запутанным, если бы вы назвали свой параметр event вместо данных в первом примере:

this.ws.onmessage = (event) => {
    callback(event.data);
};

Вы также можете рассматривать это как события на стороне сервера по сравнению с событиями на стороне клиента - ваш первый пример - это событие на стороне клиента, тогда как второй пример - это событие на стороне сервера. Клиентские события соответствуют Websockets API , тогда как серверные события в мире NodeJS, как правило, используют источники событий.

...