消息事件中的回调突变

Callback Mutation Inside Message Event

所以我 运行 遇到了一些 Javascript 怪事,如果我编写这样的函数,我传递的回调工作正常

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

如果你这样写

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

它将回调变为消息事件我似乎无法弄清楚为什么,但如果有人能解释的话,我想了解这种行为。提前致谢。

我认为问题遗漏了关键信息,但根据代码示例,我认为您正在使用 https://github.com/websockets/ws 实现,对吗?

如果是,那么.ws.on('message', ...指的是Event Emitter listener。传递给您的处理程序的参数是消息或流或发射器发出的任何数据对象。

.ws.onmessage指的是浏览器的Websocket API - so the parameter passed there is a MessageEvent。从规范中可以看出,dataMessageEvent class 上的 属性,这解释了为什么必须使用 1 级间接引用作为 data.data

如果您在第一个示例中调用参数 event 而不是数据,也许会减少混淆:

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

您还可以将此视为服务器端事件与客户端事件 - 您的第一个示例是客户端事件,而第二个示例是服务器端事件。客户端事件符合 Websockets API,而在 NodeJS 世界中,服务器端事件通常使用事件发射器。