您的位置:

深入理解onmessage事件

前端实时通信中,WebSocket作为一种全双工通信协议,既支持客户端发送信息到服务端,又支持服务端推送信息到客户端,为实现实时通信提供了便利。其中,onmessage事件是WebSocket对象中的一个事件,用来监听服务端发送到客户端的消息。本文将从多个角度探究onmessage事件的相关特性。

一、onmessage事件的基础用法

在WebSocket对象中,onmessage事件是用于接收服务器传送到客户端的信息的回调函数,通过设置WebSocket对象的onmessage属性,当有服务器端消息到来时自动触发。

let ws = new WebSocket('ws://localhost:8080');

ws.onmessage = function(event) {
    // 接收到来自服务器的消息,执行相应代码
    console.log(event.data);
};

当客户端接收到服务器端发送过来的文本格式数据时,event对象的data属性即为服务器端发送的数据信息;当接收到二进制格式的数据时,则可通过WebSocket对象的buffer属性获取数据流。

二、多种数据类型的接收处理

可以通过WebSocket的send方法向服务器端发送多种类型的数据,因此在onmessage事件的回调函数中也需要判断接收到的数据类型。

文本格式数据:

ws.onmessage = function(event) {
    if (typeof event.data === 'string') {
        console.log(event.data);
    }
};

二进制格式数据:

ws.onmessage = function(event) {
    if (event.data instanceof ArrayBuffer) {
        var buffer = event.data;
        // 对buffer进行相应处理
    }
};

Blob格式数据:

ws.onmessage = function(event) {
    if (event.data instanceof Blob) {
        var blob = event.data;
        // 对blob进行相应处理
    }
};

接收到的Blob数据还可以使用FileReader对象进行读取,得到文本或二进制数据。

三、处理大量数据

当一次性要发送大量数据时,服务端往往会分批次发送,因此客户端需要处理多条消息的情况。

ws.onmessage = function(event) {
    if (typeof event.data === 'string') {
        // 对文本格式数据进行处理
    } else if (event.data instanceof ArrayBuffer) {
        var buffer = event.data;
        // 对二进制格式数据进行处理
    } else if (event.data instanceof Blob) {
        var blob = event.data;
        // 对Blob格式数据进行处理
    }
};

通过判断接收到的数据类型,将不同的数据分别处理。

四、结合Promise实现消息队列

当客户端接收到大量消息时,处理每一条消息可能会消耗比较长的时间,为了让处理结果更加的有条理和可控,可以使用Promise实现消息队列。

let messageQueue = Promise.resolve();

ws.onmessage = function(event) {
    let message = event.data;
    messageQueue = messageQueue.then(() => {
        // 对接收到的消息进行处理
        console.log(message);
    });
};

每次接收到消息后将其加入到Promise队列中,通过then方法不断执行队列中的Promise对象,实现消息的有序处理。

五、结合RxJS实现数据流处理

使用RxJS也能实现WebSocket数据流的处理。通过observable的subscribe方法接收消息,使用map、filter等RxJS操作符处理接收到的数据流。

import { webSocket } from 'rxjs/webSocket';

const ws = webSocket('ws://localhost:8080');

ws.subscribe({
    next: (message) => {
        console.log(message);
    },
    error: (err) => {
        console.error(err);
    },
    complete: () => {
        console.log('WebSocket连接已关闭!');
    }
});

这里使用RxJS中的webSocket方法创建WebSocket对象,使用subscribe方法接收数据流。在subscribe中可以使用observer中的next、error、complete等方法对接收到的数据流进行处理。

总结

本文从基础用法、多种数据类型处理、大量数据处理、Promise和RxJS结合实现数据流处理等方面详细讲解了onmessage事件的相关知识。通过使用onmessage事件,我们可以轻松地实现WebSocket客户端接收来自服务器端的消息,并进行处理。