WebWorker进阶

WebWorker进阶WebWorker 与主线程之间的通信这篇文章主要分享介绍了 WebWorker 特殊应用场景 扩展了 WebWorker 的能力 为跨页面通信提供了另外一种思路 在上一篇文章里面也有了解到 webworker 与主线程之间的通信 使用的是一个 PostMessage 在上一篇文章中 有个例子是 从主线程到子线程传了一个 json 从子线程到主线程传了一个 number 由此可见 Webworker 与主线程通信

WebWorker与主线程之间的通信

这篇文章主要分享介绍了WebWorker特殊应用场景, 扩展了WebWorker的能力, 为跨页面通信提供了另外一种思路。在上一篇文章里面也有了解到webworker与主线程之间的通信,使用的是一个PostMessage。在上一篇文章中,有个例子是,从主线程到子线程传了一个json,从子线程到主线程传了一个number,由此可见,Webworker与主线程通信之间的通信内容可以是:字符串、对象、二进制或者是任何JavaScript可以表示存储的内容,只要这个内容可以用JavaScript的变量来表示,那么这个内容就可以被PostMessage传输,然后这个传输就是拷贝关系。也就是说在子线程里面到主线程会完全拷贝一份一模一样的,之后再送给需要接收消息的另一方,这就是一个拷贝关系,这个关系主要是为了防止传输过程中出现的意外造成数据的不完整,然后在JavaScript中,一些参数的传递都是一个浅拷贝,浅拷贝违背了子线程和主线程只能通过PostMessage传递消息的原则。所以WebWorker与主线程通信之间的通信关系都是拷贝关系。但是我们需要考虑的一点是,拷贝数据量过大时,拷贝起来是比较消耗性能的,因此WebWorker有一个转移的方式,转移起来只能使用二进制,转移之后当前线程无论是从主到子还是从子到主,转移之后的二进制数据就没有操作权了,接收方才有操作权。

 webWorker.postMessage(arrayBuffer, [arrayBuffer]); 

执行同页面的WebWorker

JavaScript代码要在WebWorker里面执行的代码需要放在同一个文件里。

  • 未知的script 类型,代码不会执行
      
  • 二进制读取并开启新的WebWorker
     const blob = new Blob([document.getElementById('samePageWorker').text]); //把读取文件的内容放到内存中,之后再返回一个内存地址 const url = URL.createObjectURL(blob); /* 获取保存在内存中的文件地址 */ const webWorker = new Worker(url); webWorker.postMessage(123); 

WebWorker嵌套

    //主进程起了一个main.js的WebWorker,向它发送了一个Hello
    const webWorker = new Worker('./main.js');
    window.webWorker = webWorker;
    webWorker.postMessage('Hello');
    
    //子进程main.js又起了一个worker然后向下面这个子进程发送了一个message:word
    this.addEventListener('message', event => {
        console.log('received index.html data', event.data);
    }, false);
    const webWorker = new Worker('./index.js');
    webWorker.postMessage('Word');
    
    //在index.js也就是最里层的WebWorker加了一个消息监听事件,接收到了下面这个数组
    this.addEventListener('message', event => {
        console.log('received main data', event.data);
    }, false)};

Shared WebWorker(跨页面通信)

不能使用console

 const shareWorker = new SharedWorker('./main.js'); window.shareWorker = shareWorker; shareWorker.port.start(); shareWorker.port.postMessage(1); shareWorker.port.onmessage = event => { console.log(event.data); } const shareWorker = new SharedWorker('./main.js'); shareWorker.port.postMessage(1); shareWorker.port.onmessage = event => { console.log(event.data); }; shareWorker.port.start(); let temp = 1; this.onconnect = event => { const port = event.ports[0]; port.start(); port.onmessage = e => { temp = temp + e.data; port.postMessage(temp); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208147.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:15
下一篇 2026年3月19日 下午12:15


相关推荐

  • OpenClaw新手指南:理解workspace和如何轻松安装skills

    OpenClaw新手指南:理解workspace和如何轻松安装skills

    2026年3月14日
    5
  • 两位数相乘的速算法靠谱吗?

    两位数相乘的速算法靠谱吗?我们有了常规的知识体系,更多时候会感觉繁琐,或者感觉力不从心,所以我们就会有投机的心理,一旦发现存在一些相关的攻略,看起来可能会颠覆原本的认知,我们就会更加欣喜。比如前几天我无意中看到了下面的速算攻略。我直接拿来原文。…

    2022年6月7日
    48
  • 模拟实现strstr函数

    模拟实现strstr函数推荐一篇讲解KMP算法的文章–阮一峰http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html推荐一篇讲解Boyer-Moore算法的文章–阮一峰http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html…

    2022年6月25日
    25
  • 运行时常量池与字符串常量池_常量池是什么

    运行时常量池与字符串常量池_常量池是什么文章目录1)方法区包含哪些内容?2)运行时常量池存在什么地方?3)取消永久代后,方法区的实现?4)字符串常量池和运行时常量池究竟去了哪里?4)元空间是什么?5)关于为什么移除永久代?5)补充        我们知道在JDK1.8中取消了永久代,区而代之使用了元空间来实现方法区。话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。1)方法区包含哪些内容?方法区包含哪些内容,摘录自《java虚拟机规

    2022年7月28日
    8
  • Matlab中弧度转角度、角度转弧度

    Matlab中弧度转角度、角度转弧度Content弧度转角度角度转弧度弧度转角度rad2deg()函数可以用于将弧度转为角度示例:角度转弧度deg2rad()函数可以用于将角度转换为弧度。示例:

    2022年6月15日
    70
  • C++解决大整数加法

    C++解决大整数加法c 解决大整数加法问题描述 求两个不超过 200 为的非负整数的和输入数据 输入有两行 每行是一个不超过 200 位的非负整数 没有多于的前导 0 输出要求 输出只一行 即相加后的结果 结果里不能有多于的前导 0 即如果结果是 342 那么就不能输出 0342 输入样例 输出样例 55555

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号