Channel Messaging API 的使用

Channel Messaging API 是HTML5中引入的一种高级通信机制,它允许在Web Workers之间,以及Web Workers与主线程之间建立高效、安全的双向通信通道。这一API特别适用于需要频繁交换数据或维持长期通信的场景,提高了Web应用的性能和灵活性。

基础概念

消息通道(MessageChannel) 是Channel Messaging API的核心组件,它由两个端点(MessagePort对象)组成,每个端点都可以发送和接收消息。这种设计允许在任意两个执行上下文中建立直接的通信链路,不仅限于Worker与主线程之间。

为什么使用Channel Messaging API

  • 解耦通信:通过消息通道,可以实现更加灵活的模块间通信,减少直接依赖。
  • 安全隔离:消息通过异步方式传递,避免了直接访问对方上下文的资源,保证了沙箱安全。
  • 高性能:对于大量或持续的数据交换,比频繁使用postMessage更高效。

如何使用

创建消息通道

var channel = new MessageChannel();

上述代码创建了一个新的消息通道,包含两个MessagePort实例:channel.port1channel.port2

发送消息

// 在发送端
channel.port1.postMessage('Hello from Port 1');// 在接收端
channel.port2.onmessage = function(event) {console.log('Received:', event.data);
};

接收消息

channel.port2.onmessage = function(event) {console.log('Received:', event.data);// 可以通过event.ports进一步创建新的通信通道
};

跨域通信

与其他消息传递方式一样,Channel Messaging也支持跨域通信,但需要遵循同源策略或使用CORS机制。

实战示例:主线程与Worker间的双向通信

目标

展示如何使用Channel Messaging API在主线程和Web Worker之间建立一个链式消息传递系统,其中主线程发送一个初始消息给Worker,Worker处理后通过一个新的Channel将消息回传给主线程,演示双向通信的灵活性。

文件结构
  • index.html:包含JavaScript代码的HTML文件
  • worker.js:Web Worker脚本
index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Channel Messaging API 示例</title>
</head>
<body><h1>Channel Messaging API 示例</h1><button onclick="startChainCommunication()">开始链式通信</button><div id="output"></div><script>function startChainCommunication() {if (typeof(Worker) !== "undefined") {var worker = new Worker('worker.js');var outputDiv = document.getElementById('output');// 创建消息通道var channel = new MessageChannel();// 当从Worker接收到消息时channel.port1.onmessage = function(event) {outputDiv.innerHTML += '<br>Received from Worker: ' + event.data;};// 向Worker发送消息,包括一个消息通道的端口worker.postMessage('Hello from Main Thread!', [channel.port2]);} else {document.getElementById('output').innerHTML = 'Your browser doesn\'t support Web Workers.';}}</script>
</body>
</html>
worker.js
self.onmessage = function(event) {var data = event.data;var outputPort = event.ports[0];// 在Worker内部处理消息var processedData = data + ' processed in Worker.';// 创建一个新的消息通道,用于回传消息var replyChannel = new MessageChannel();// 设置回传消息的监听器replyChannel.port1.onmessage = function(e) {console.log('Worker received back:', e.data);};// 向主线程回传处理后的消息和新的消息通道outputPort.postMessage(processedData, [replyChannel.port2]);
};
工作原理
  1. 用户点击“开始链式通信”按钮时,startChainCommunication函数被触发。
  2. 主线程创建一个新的MessageChannel实例,并将其中的一个端口port2连同初始消息一起通过postMessage发送给Worker。
  3. Worker接收到消息后,处理数据,并使用接收到的port2通过另一个新创建的MessageChannelport2回传处理后的消息给主线程。
  4. 主线程在channel.port1上监听到Worker回传的消息,并在页面上显示。

此示例展示了Channel Messaging API如何促进主线程与Worker之间的灵活、高效的双向通信,,不仅增强了Web Workers的功能,也为前端开发者在构建高性能、模块化Web应用时提供了更多的可能性。通过理解和掌握这一API,开发者可以设计出更加高效、响应迅速的Web应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中英双语介绍美国的州:印第安纳州(Indiana)

中文版 印第安纳州简介 印第安纳州位于美国中西部地区&#xff0c;是一个以其农业、制造业和体育文化而著称的州。以下是对印第安纳州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 印第安纳州东临俄亥俄州&#xff0c;北接密歇根州…

白骑士的Python教学高级篇 3.1 多线程与多进程

系列目录 上一篇&#xff1a;白骑士的Python教学进阶篇 2.4 高级数据结构 在现代编程中&#xff0c;提升程序性能和处理能力的常见方法之一是并发编程&#xff0c;通过同时执行多个任务来提高效率。Python中主要有两种并发方式&#xff1a;多线程和多进程。理解它们的概念、差…

数据集成面试题

Flume 一、flume组成 --Agent Flume的部署单元&#xff0c;本质上是一个JVM进程,Agent主要由Source、Channel、Sink三个部分组成 --Source 收集数据&#xff0c;以event为单元进行封装发送给channel 参数配置&#xff1a;当采集速度比较慢&#xff0c;调整batchSize参数&…

IOS Swift 从入门到精通:写入 Firestore数据库

文章目录 FirestoreManager 类创建文档更新文档更新 Firestore 权限规则现在,我们想要在 Firestore 中添加或更新文档。如果您还没有,我建议您阅读有关设置 Firebase Auth 和从 Firestore 读取的部分。您必须在应用程序中启用 Firebase,并在项目中启用 Firestore 数据库,才…

【IT专业入门,高考假期预习指南】高考后的IT征途:启航前的准备与策略

IT专业入门&#xff0c;高考假期预习指南 七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。作为该领域的前行者和经验前辈&a…

Java中的分布式事务管理

Java中的分布式事务管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的分布式事务管理&#xff0c;这是在现代大规模应用中必须解决…

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…

Python协作运动机器人刚体力学解耦模型

&#x1f3af;要点 &#x1f3af;腿式或固定式机器人模型 | &#x1f3af;网格、点云和体素网格碰撞检测 | &#x1f3af;正反向运动学和动力学 | &#x1f3af;机器人刚体力学计算 | &#x1f3af;编辑参考系姿势和路径 | &#x1f3af;软件接口实体机器人模拟 | &#x1f3a…

使用shell脚本进行clang-tidy静态代码分析

文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言 clang-tidy 是基于 Clang 的工具&#xff0c;提供了丰富的代码检查功能&#xff0c;可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang…

分子AI预测赛Task2笔记

下面所述比较官方的内容都来自官方文档 ‍‌⁠‌‍​​​‌​​⁠​​​​​&#xfeff;​​​&#xfeff;‍‬​​‍⁠‍‍​​‬​&#xfeff;‌​​​‌‍‬​​​​​​‍‌Task2&#xff1a;赛题深入解析 - 飞书云文档 (feishu.cn) 赛题背景 强调了人工智能在科研领域&…

WebDriver API

WebDriver API 是一组允许程序控制和自动化Web浏览器的接口&#xff0c;它是Selenium框架的一部分。Selenium 是一个广泛使用的开源自动化测试工具&#xff0c;用于Web应用程序的自动化测试。WebDriver API 提供了与浏览器进行交互的能力&#xff0c;支持多种浏览器&#xff0c…

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了&#xff0c;有什么方法可以恢复吗&am…

java反射和注解

反射 获取class对象的三种方法 ①&#xff1a;Class.forName("全类名"); ②&#xff1a;类名.class ③&#xff1a;对象.getclass(); 代码样例 package com.ithema;public class Main {public static void main(String[] args) throws ClassNotFoundException {//第…

基于Canvas的Html5多时区动态时钟实战

目录 前言 一、关于Canvas技术 1、Canvas是什么 2、Canvas的属性及渲染特性 二、Canvas动态多时区展示 1、新建html页面 2、创建Canvas对象 3、绘制所有的时钟 总结 前言 出差旅行相信大家一定会住酒店&#xff0c;大家在酒店的前台进行预订的时候&#xff0c;是不是都…

centos执行yum相关命令报错的可能原因

文章目录 1. 执行yum命令是报下面一大帕拉2. 安装某个包报错&#xff0c;找不到这个包 1. 执行yum命令是报下面一大帕拉 最后一行报错&#xff0c;在repo文件中找不到空baseurl&#xff1a;xxx / x86_64 执行这行命令把这个找不到的 xxx 禁掉即可sudo yum-config-manager --di…

【项目日记(三)】搜索引擎-搜索模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言2.项目回顾3.搜索流程3.1分词3.2触发3.3去重3.4排序3.5包装 4.总结 1.前言 在前…

Qt的源码目录集合(V5.12.12版本)

目录 1.QObject实现源码 2.qml中的ListModel实现源码 3.qml中的JS运行时的环境和数据类型源码 1.QObject实现源码 .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.h .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.cpp .\Qt\Qt5.12.12\5…

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题 1.编辑–>首选项–> 2.如果想每次插U盘都连接到主机就选“将设备连接到主机” 如果想每次插U盘都进行选择&#xff0c;就选择“询问要执行的操作”

Vscode常用快捷键

前言: 使用环境&#xff1a;ubuntu22.04 按键组合功能AltO切换源/头文件CtrlK,CtrlC注释CtrlK,CtrlU取消注释CtrlK,CtrlI格式化F12跳转函数定义CtrlAlt-跳转函数后返回CtrlW关闭当前标签页CtrlB关闭右侧边栏Ctrl← /→光标移至单词首/尾CtrlShift←/→跳选单词选中CtrlDelete删…

【软考论文】论基于架构的软件设计方法及应用(ABSD)

目录 一、题目二、论文2.1 摘要2.2 正文三、扩展一、题目 基于架构的软件设计(Architecture-Based Software Design,ABSD)方法以构成软件架构的 商业、质量和功能需求 等要素来驱动整个软件的开发过程。ABSD是一个自顶向下,递归细化的软件开发方法,它以软件系统功能的分解…