消息事件内的回调变异

时间:2018-11-01 18:42:24

标签: javascript ecmascript-6 websocket callback mutation

因此,如果我编写这样的函数,则我遇到了一些Javascript怪异之处,我传递的回调可以正常工作

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

如果你这样写

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

它将回调更改为消息事件,我似乎无法弄清楚为什么,但是如果有人可以解释,我想了解这种行为。预先感谢。

1 个答案:

答案 0 :(得分:1)

我认为该问题省略了关键信息,但是基于代码示例,我认为您正在使用https://github.com/websockets/ws实现,对吗?

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

.ws.onmessage指的是浏览器的Websocket API-因此在此处传递的参数为MessageEvent。从规范中可以看到,dataMessageEvent类的一个属性,它解释了为什么必须将1级间接引用称为data.data

如果调用参数event而不是第一个示例中的数据,可能会减少混乱:

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

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