深入理解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客戶端接收來自服務器端的消息,並進行處理。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190414.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 22:33
下一篇 2024-11-29 22:33

相關推薦

  • 抖音外放親媽下葬事件的背後真相

    近期,一段抖音外放親媽下葬的視頻引發廣泛關注和熱議。不少人對這個事件感到震驚和憤怒,認為這種行為非常不尊重親人,觸犯了社會公德和家庭道德。但是,事情真相到底是什麼呢?我們有必要從多…

    編程 2025-04-28
  • cc.director.on事件監聽器

    本文將從多個方面詳細介紹Cocos Creator中的cc.director.on事件監聽器。 一、cc.director.on的作用和用法 cc.director.on是Coco…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • JavaScript點擊事件全方位指南

    一、click事件基礎 click事件是最常用的鼠標事件之一,當元素被單擊時觸發。click事件適用於大多數HTML元素(<a>、<button>)和SVG…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 探究keyup和keydown事件

    一、介紹 在前端開發中,代碼執行通常與用戶操作有關。用戶操作中,常用的是鍵盤事件,其中keydown和keyup事件是最為常見的兩種。這兩種事件都可以用來監測用戶按鍵,但它們有不同…

    編程 2025-04-25

發表回復

登錄後才能評論