【JS】postMessage与MessageChannel

前言

postMessageMessageChannel 都是用来实现跨文档跨窗口跨线程(Web Worker)的消息传递机制。

postMessage

可以在 iframe、同源或跨源窗口之间传递数据,也可以用于主线程与 Web Worker 之间的通信。

postMessage 是一种单向的消息传递机制,适用于同源或跨域窗口之间的通信。可以用它来向一个窗口发送消息,而这个窗口通过监听 message 事件来接收消息。通常用于主页面和 iframe 或主线程和 Web Worker 之间的通信。

// 在主线程中创建 Web Worker
const worker = new Worker('worker.js');// 发送消息到 Worker
worker.postMessage({ type: 'INIT', data: 'Hello!' });// 在 Worker 中监听消息
self.addEventListener('message', (event) => {console.log('监听到的消息:', event.data);// 发送响应回主线程self.postMessage('你好!');
});// 在主线程中监听 Worker 的响应
worker.addEventListener('message', (event) => {console.log('监听到的消息:', event.data);
});

postMessage实现iframe跨域通信请看本人另一篇文章:postMessage实现iframe跨域通信

MessageChannel

MessageChannel 创建两个 MessagePort 对象,这两个端口可以通过 postMessage 相互通信。它比 postMessage 更灵活,适用于需要复杂双向通信的场景。

// 创建一个 MessageChannel 实例
const channel = new MessageChannel();// 获取两个端口
const port1 = channel.port1;
const port2 = channel.port2;// 监听 port1 上的消息
port1.onmessage = (event) => {console.log('接收到的消息:', event.data);
};// 向 port2 发送消息
port2.postMessage('port2发送的消息');

可以在不同的上下文中使用 postMessage 传递 port2 或 port1

file1.js

const channel = new MessageChannel();// 监听来自 port1 的消息
channel.port1.onmessage = (event) => {console.log("接收到的消息:", event.data);
};// 将 port2 传递给目标文件(iframe 或 Web Worker)
const iframe = document.querySelector('iframe');
iframe.contentWindow.postMessage('Sending port', '*', [channel.port2]);// 向 port1 发送一条消息
channel.port1.postMessage("你好,我是file1的消息");

file2.js

// 监听来自主页面的消息
window.addEventListener('message', (event) => {// 检查是否收到了 MessageChannel 的 portif (event.data === 'Sending port' && event.ports.length > 0) {const port2 = event.ports[0];// 监听 port2 上的消息port2.onmessage = (event) => {console.log("监听到的消息:", event.data);// 回应 port1 的消息port2.postMessage("我是file2的消息");};}
});

React 调度器 Scheduler 源码也有用到 MessageChannel,根据可用的 API 选择最合适的调度方法。

  • Node.js 环境中,优先使用 setImmediate,它的执行时间更早,并且不会阻止 Node.js 进程退出。
  • MessageChannel 有时可能导致 Node.js 进程延迟退出。在浏览器环境中,比 setTimeout 更精确地控制任务执行时间(更少的时间颗粒度)。例如,setTimeout 可能会有最低延迟限制(如 4 毫秒),而 MessageChannel 可以更快地触发任务。
  • localSetTimeout: 标准的 setTimeout 函数,如果在环境中既没有 setImmediate 也没有 MessageChannel,那么使用 setTimeout 作为最后的回退方案。通常是在非浏览器环境中,比如一些测试环境或非常旧的环境中。

在这里插入图片描述

总结

postMessageMessageChannel
是否支持跨域
通信方式单向通信双向通信
消息数据可以传递基本数据类型和结构化克隆的数据(如对象、数组、文件等),但不能直接传递上下文(如函数)不仅可以传递数据,还可以通过 postMessage 传递 MessagePort,从而创建多个通信通道
优势简单快捷适用于较复杂的双向通信

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

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

相关文章

数据结构-3.1.栈的基本概念

一.栈的定义: 栈和线性表的区别:栈只能在表尾一端进行插入或者删除的操作,而线性表可以在任意一个地方进行插入或者删除 二.有关栈的关键术语: 三.栈的基本操作: 1.回顾线性表的基本操作: 2.栈的基本操作&…

佰朔资本:国内海风加速招标 船舶行业景气上行

昨日,沪指盘中一度下探失守2700点,尾盘在地产、银行等板块的带动下发力上扬,深证成指亦翻红。到收盘,沪指涨0.49%报2717.28点,深证成指涨0.11%报7992.25点,创业板指跌0.11%报1533.47点,上证50指…

商业终端架构技术-未来之窗行业应用跨平台架构

未来之窗行业应用跨平台架构 以下是对未来之窗行业应用跨平台架构中客户端的稳定优势和网页跨平台性质的扩展列举: 一、客户端的稳定优势: 1. 离线可用性 - 即使在没有网络连接的…

如何将MySQL卸载干净(win11)

相信点进来的你肯定是遇到了这个问题,那就是在安装MySQL的时候操作错误,最后结果不是自己想要的。卸载重新安装又发现安装不了。其实最主要的原因就是没有将MySQL卸载干净,那么如何把MySQL卸载干净?下面本篇文章就来给大家一步步介…

Tiny-universe 1:Qwen整体介绍Qwen-blog

Qwen模型架构讲解直播:直播链接 Qwen的整体架构与Llama2类似,如下图所示: 其中: tokenizer将文本转为词表里面的数值。数值经过embedding得到一一对应的向量。attention_mask是用来看见左边、右边,双向等等来设定。各类下游任务&#xff0…

Kafka集群扩容(新增一台kafka节点)

kafka集群扩容、kafka topic迁移 现有环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3 扩容之后环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3192.168.17.54ka…

InternVL 微调实践闯关任务

基础任务 follow 教学文档和视频使用QLoRA进行微调模型,复现微调效果,并能成功讲出梗图. 尝试使用LoRA,或调整xtuner的config,如LoRA rank,学习率。看模型Loss会如何变化,并记录调整后效果(选做&#xff…

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1:不同模型变体在 AmazonClothing 数据集上的初步研究图 2:CKD模型架构的说明图 3:在 Amazon-Clothing 数据集上训练过…

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法,希望我的分享对你有所帮助! 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上,加上事件结构,实现单击一次按…

后端接收数组,集合类数据

文章目录 一. 请求行Path参数(不建议)二.数组接收(不建议)三.List集合接收(建议)四. GET请求既包含请求体又包含请求行 一. 请求行Path参数(不建议) DeleteMapping("/{ids}&quo…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢?为什么Redis Cluster哈希槽数量是16384? 关键词:一致性 Hash,哈希槽, 带着…

iOS 巨魔神器,Geranium 天竺葵:6大功能,个个都解决痛点

嘿,这是黑猫。如果你装了巨魔,却只知道安装第三方APP,那就是暴殄天物。巨魔的价值不仅是应用侧载,还有强大的玩机工具生态——这也是我花费大量时间,去制作巨魔精选IPA合集的原因。 通过巨魔商店安装的APP&#xff0c…

SQL优化-MySQL Explain中出现Select tables optimized away

文章目录 前言相关解释总结 前言 今天在做SQL优化的时候,在使用explain执行SQL时,出现了以下情况: EXPLAIN SELECT m1.id from station m1 INNER JOIN site s ON m1.codes.stationcode where receivetime(SELECT MAX(m2.receivetime) FROM…

Python爱心射线(完整代码)

目录 系列目录 写在前面​ 完整代码 下载代码 代码分析 写在后面 系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3

springsecurity+jwt实现前后端分离认证授权

文章目录 1.简介2.快速入门3.认证3.1登录校验流程3.2原理初探3.3认证详流程详解3.4 分析UsernamePasswordAuthenticationFilter 4.案例实战4.1 思路分析4.2准备工作4.3实战1.数据库校验用户2.核心代码1.创建UserDetailsService实现类2.创建UserDetails实现类3.密码加密存储模式…

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载: 先去clickhouse官网进行下载,继续往下翻找文档,将DBeaver也下载下来 下载地址:https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…

Linux文件IO(一)-open使用详解

在 Linux 系统中要操作一个文件,需要先打开该文件,得到文件描述符,然后再对文件进行相应的读写操作(或其他操作),最后在关闭该文件;open 函数用于打开文件,当然除了打开已经存在的文…

优化算法(四)—蚁群算法(附MATLAB程序)

蚁群算法(Ant Colony Optimization, ACO)是一种模拟蚂蚁觅食行为的优化算法,由Marco Dorigo于1990年提出。它利用了蚂蚁在寻找食物的过程中通过释放信息素来相互影响的机制,以找到最优解或接近最优解。蚁群算法特别适用于解决组合…

【高级编程】网络编程 基于 TCPUDP 协议的 Socket 编程

文章目录 IP地址Socket基于 TCP 协议的 Socket 编程基于 UDP 协议的 Socket 编程 IP地址 IP地址(Internet Protocol):唯一标识网络上的每一台计算机 IP地址的组成:32位,由4个8位二进制数组成 11000000.10101000.000…

C++ 赋值运算符重载

个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 赋值运算符重载的特点: 成员函数:赋值运算符重载必须…