SharedWorkerGlobalScope属性数据共享示例解析

 更新时间:2022年12月27日 13:46:41   作者:田八  
这篇文章主要为大家介绍了SharedWorkerGlobalScope属性数据共享示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

上一章介绍了Worker的全局作用域,了解到DedicatedWorkerGlobalScope是继承自WorkerGlobalScope的;

这一章介绍的SharedWorkerGlobalScope也是继承自WorkerGlobalScope的,那么SharedWorkerGlobalScopeDedicatedWorkerGlobalScope有什么区别呢?

SharedWorkerGlobalScope

SharedWorkerGlobalScopeDedicatedWorkerGlobalScope一样都是一个全局作用域,它的实例是SharedWorker,它的原型是WorkerGlobalScope,它的构造函数是SharedWorkerGlobalScope

SharedWorker中可以使用self关键字来访问SharedWorkerGlobalScope的实例,也可以使用this关键字来访问SharedWorkerGlobalScope的实例。

他们之间的关系如上图所示。

SharedWorkerGlobalScope的属性

SharedWorkerGlobalScope的属性大多数和DedicatedWorkerGlobalScope一样,只是少了onmessageonerror,因为SharedWorkerGlobalScope是多个DedicatedWorkerGlobalScope共享的,所以SharedWorkerGlobalScopeonmessageonerror是多个DedicatedWorkerGlobalScope共享的。

这里直接通过函数签名的方式来介绍SharedWorkerGlobalScope的属性。

interface SharedWorkerGlobalScope extends WorkerGlobalScope {
    readonly name: string;
    close(): void;
    onconnect: EventHandler
}
  • nameSharedWorkerGlobalScope的名字,它是只读的,只能在SharedWorker的构造函数中设置,如果使用相同的name创建多个SharedWorker,那么它们会共享同一个SharedWorkerGlobalScope
  • close():关闭SharedWorkerGlobalScope,它会丢弃所有的等待执行的任务。
  • onconnect:当有新的DedicatedWorkerGlobalScope连接到SharedWorkerGlobalScope时,会触发onconnect事件。

可以对比一下DedicatedWorkerGlobalScope的属性,其实相差不大,只是少了onmessageonerror,多了onconnect

数据共享

DedicatedWorkerGlobalScope是通过postMessage来与DedicatedWorkerGlobalScope通信的,而SharedWorkerGlobalScope是通过onconnect来与DedicatedWorkerGlobalScope通信的。

SharedWorkerGlobalScopeonconnect事件会返回一个MessagePort,它是一个双向的通信通道,可以通过它来与DedicatedWorkerGlobalScope通信。

interface MessagePort extends EventTarget {
    readonly name: string;
    close(): void;
    postMessage(message: any, transfer?: Transferable[]): void;
    start(): void;
    onmessage: EventHandler;
    onmessageerror: EventHandler;
}

看函数签名可以发现MessagePort也是继承自EventTarget的,这就意味着MessagePort也可以使用addEventListener来监听事件。

MessagePort自带的属性和方法不难发现和DedicatedWorkerGlobalScope的是相同的,只是多了一个sart方法。

不同于DedicatedWorkerGlobalScope的是,MessagePort是双向的,或者说MessagePort是双向的一边,两个MessagePort形成一个双向的通信通道。

MessagePortChannel Messaging API的一部分,这又引出了Channel Messaging API

Channel Messaging API

Channel Messaging API允许我们创建一个双向的通信通道,它的实例是MessageChannel,它的原型是EventTarget,它的构造函数是MessageChannel

interface MessageChannel extends EventTarget {
    readonly port1: MessagePort;
    readonly port2: MessagePort;
}

可以看到MessageChannel有两个只读属性,分别是port1port2,它们都是MessagePort的实例,它们之间形成一个双向的通信通道。

const channel = new MessageChannel();
channel.port1.onmessage = (event) => {
    console.log(event.data);
};
channel.port2.postMessage('hello');

上面的代码中,channel.port1channel.port2是一个双向的通信通道,它们之间可以互相通信。

当然通常我们不会这样使用MessageChannel,那可以用来做什么呢,我们可以实现数据拷贝:

const channel = new MessageChannel();
channel.port1.onmessage = (event) => {
    console.log(event.data);
};
var obj = { a: 1 };
obj.b = obj;
channel.port2.postMessage(obj);

这里使用的是结构化克隆算法,它可以克隆复杂的数据结构,而不是简单的拷贝引用。

SharedWorker

当我们了解了SharedWorkerGlobalScopeMessagePortMessageChannel之后,我们对SharedWorker的使用就不会陌生了。

// main.js
const worker = new SharedWorker('worker.js', 'worker');
worker.port.onmessage = (event) => {
    console.log(event.data);
};
// 在讲 SharedWorker 的文章中讲过
// 如果使用 onmessage 监听,会自动调用 start 方法
// 如果使用 addEventListener 监听,需要手动调用 start 方法
// 所以下面的代码可以省略
worker.port.start();
worker.port.postMessage('hello');

当我们有上面的基础之后,来看一下上面构建的SharedWorker的代码,不难发现都是我们之前讲过的:

  • new SharedWorker:是SharedWorker的构造函数,这个是属于SharedWorker
  • worker.port:是MessagePort的实例,也是属于SharedWorker
  • worker.port.onmessage:是MessagePortonmessage事件
  • worker.port.start():是MessagePortstart方法
  • worker.port.postMessage:是MessagePortpostMessage方法

通过上面的代码就可以推断出SharedWorker的函数签名:

interface SharedWorker extends EventTarget {
    constructor(scriptURL: string, name?: string);
    readonly port: MessagePort;
}

事实的函数签名也是和上面的一致。

上面是在主函数中创建SharedWorker,那么在SharedWorker中是怎么使用的呢,我们来看一下:

// worker.js
onconnect = (event) => {
    const port = event.ports[0];
    port.onmessage = (event) => {
        console.log(event.data);
    };
    port.start();
    port.postMessage('hello');
};

SharedWorker中,只需要监听onconnect事件,然后在事件中获取MessagePort,然后就可以使用MessagePort的方法了。

这个是属于SharedWorkerGlobalScope的,可以把文章网上翻翻,就可以看到了。

总结

通过这次分析SharedWorkerGlobalScope之后,我们对SharedWorker的使用就不会陌生了;

它的使用和Worker是一样的,不同是他们的全局作用域不同,只是会有一些特定的方法,都是WorkerGlobalScope的子类,所以它可以使用WorkerGlobalScope的所有方法。

也通过这次分析,我们认识到MessagePortMessageChannel,这些都是SharedWorker的基础也是核心,它们之间的关系也是非常重要的。

而且认识到MessagePortMessageChannel之后,其实跨页面通信也可以使用它们,也可以使用它们来做一些其他的事情,这些就看自己的想象力了。

以上就是SharedWorkerGlobalScope属性数据共享示例解析的详细内容,更多关于SharedWorkerGlobalScope属性的资料请关注脚本之家其它相关文章!

相关文章

  • Java抽象的本质解析

    Java抽象的本质解析

    对于面向对象编程来说,抽象是它的一大特征之一,在 Java 中可以通过两种形式来体现OOP的抽象:接口和抽象类,下面这篇文章主要给大家介绍了关于Java基础抽象的相关资料,需要的朋友可以参考下
    2022-03-03
  • Springboot集成阿里云OSS上传文件系统教程

    Springboot集成阿里云OSS上传文件系统教程

    这篇文章主要介绍了Springboot集成阿里云OSS上传文件系统教程,通过详细的图文展示,代码步骤的展示和文件配置信息,希望对你有所帮助
    2021-06-06
  • Mybatis中的resultType和resultMap查询操作实例详解

    Mybatis中的resultType和resultMap查询操作实例详解

    resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题。这篇文章主要介绍了Mybatis中的resultType和resultMap查询操作实例详解,需要的朋友可以参考下
    2016-09-09
  • 如何基于js及java分析并封装排序算法

    如何基于js及java分析并封装排序算法

    这篇文章主要介绍了如何基于js及java分析并封装排序算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java MongoDB实现列表分页查询的示例代码

    java MongoDB实现列表分页查询的示例代码

    本文主要介绍了java MongoDB实现列表分页查询的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 详解SpringBoot读取Yml配置文件的3种方法

    详解SpringBoot读取Yml配置文件的3种方法

    本文主要介绍了详解SpringBoot读取Yml配置文件的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java实现花卉管理系统

    Java实现花卉管理系统

    这篇文章主要为大家详细介绍了Java实现花卉管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Java实现简单棋盘存档和读取功能

    Java实现简单棋盘存档和读取功能

    这篇文章主要为大家详细介绍了Java实现简单棋盘存档和读取功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • java加密算法--MD5加密和哈希散列带秘钥加密算法源码

    java加密算法--MD5加密和哈希散列带秘钥加密算法源码

    这篇文章主要介绍了java加密算法--MD5加密和哈希散列带秘钥加密算法源码的相关资料,这里附实例代码,帮助到大家学习理解,需要的朋友可以参考下
    2016-11-11
  • 一文详解Java线程的6种状态与生命周期

    一文详解Java线程的6种状态与生命周期

    一个线程在给定的时间点只能处于一种状态。线程可以有6种状态:New、Runnable、Blocked、Waiting、Timed waiting和Terminated。本文将详细讲解这6种状态,需要的可以参考一下
    2022-05-05

最新评论