Мутация обратного вызова внутри сообщения

Так что я столкнулся с некоторыми странностями 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, обычно используют источники событий.

Другие вопросы по тегам