欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

 更新時間:2022年12月27日 13:46:41   作者:田八  
這篇文章主要為大家介紹了SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

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

這一章介紹的SharedWorkerGlobalScope也是繼承自WorkerGlobalScope的,那么SharedWorkerGlobalScopeDedicatedWorkerGlobalScope有什么區(qū)別呢?

SharedWorkerGlobalScope

SharedWorkerGlobalScopeDedicatedWorkerGlobalScope一樣都是一個全局作用域,它的實例是SharedWorker,它的原型是WorkerGlobalScope,它的構(gòu)造函數(shù)是SharedWorkerGlobalScope。

SharedWorker中可以使用self關(guān)鍵字來訪問SharedWorkerGlobalScope的實例,也可以使用this關(guān)鍵字來訪問SharedWorkerGlobalScope的實例。

他們之間的關(guān)系如上圖所示。

SharedWorkerGlobalScope的屬性

SharedWorkerGlobalScope的屬性大多數(shù)和DedicatedWorkerGlobalScope一樣,只是少了onmessageonerror,因為SharedWorkerGlobalScope是多個DedicatedWorkerGlobalScope共享的,所以SharedWorkerGlobalScopeonmessageonerror是多個DedicatedWorkerGlobalScope共享的。

這里直接通過函數(shù)簽名的方式來介紹SharedWorkerGlobalScope的屬性。

interface SharedWorkerGlobalScope extends WorkerGlobalScope {
    readonly name: string;
    close(): void;
    onconnect: EventHandler
}
  • nameSharedWorkerGlobalScope的名字,它是只讀的,只能在SharedWorker的構(gòu)造函數(shù)中設(shè)置,如果使用相同的name創(chuàng)建多個SharedWorker,那么它們會共享同一個SharedWorkerGlobalScope。
  • close():關(guān)閉SharedWorkerGlobalScope,它會丟棄所有的等待執(zhí)行的任務(wù)。
  • onconnect:當有新的DedicatedWorkerGlobalScope連接到SharedWorkerGlobalScope時,會觸發(fā)onconnect事件。

可以對比一下DedicatedWorkerGlobalScope的屬性,其實相差不大,只是少了onmessageonerror,多了onconnect。

數(shù)據(jù)共享

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;
}

看函數(shù)簽名可以發(fā)現(xiàn)MessagePort也是繼承自EventTarget的,這就意味著MessagePort也可以使用addEventListener來監(jiān)聽事件。

MessagePort自帶的屬性和方法不難發(fā)現(xiàn)和DedicatedWorkerGlobalScope的是相同的,只是多了一個sart方法。

不同于DedicatedWorkerGlobalScope的是,MessagePort是雙向的,或者說MessagePort是雙向的一邊,兩個MessagePort形成一個雙向的通信通道。

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

Channel Messaging API

Channel Messaging API允許我們創(chuàng)建一個雙向的通信通道,它的實例是MessageChannel,它的原型是EventTarget,它的構(gòu)造函數(shù)是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,那可以用來做什么呢,我們可以實現(xiàn)數(shù)據(jù)拷貝:

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

這里使用的是結(jié)構(gòu)化克隆算法,它可以克隆復(fù)雜的數(shù)據(jù)結(jié)構(gòu),而不是簡單的拷貝引用。

SharedWorker

當我們了解了SharedWorkerGlobalScopeMessagePort、MessageChannel之后,我們對SharedWorker的使用就不會陌生了。

// main.js
const worker = new SharedWorker('worker.js', 'worker');
worker.port.onmessage = (event) => {
    console.log(event.data);
};
// 在講 SharedWorker 的文章中講過
// 如果使用 onmessage 監(jiān)聽,會自動調(diào)用 start 方法
// 如果使用 addEventListener 監(jiān)聽,需要手動調(diào)用 start 方法
// 所以下面的代碼可以省略
worker.port.start();
worker.port.postMessage('hello');

當我們有上面的基礎(chǔ)之后,來看一下上面構(gòu)建的SharedWorker的代碼,不難發(fā)現(xiàn)都是我們之前講過的:

  • new SharedWorker:是SharedWorker的構(gòu)造函數(shù),這個是屬于SharedWorker
  • worker.port:是MessagePort的實例,也是屬于SharedWorker
  • worker.port.onmessage:是MessagePortonmessage事件
  • worker.port.start():是MessagePortstart方法
  • worker.port.postMessage:是MessagePortpostMessage方法

通過上面的代碼就可以推斷出SharedWorker的函數(shù)簽名:

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

事實的函數(shù)簽名也是和上面的一致。

上面是在主函數(shù)中創(chuàng)建SharedWorker,那么在SharedWorker中是怎么使用的呢,我們來看一下:

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

SharedWorker中,只需要監(jiān)聽onconnect事件,然后在事件中獲取MessagePort,然后就可以使用MessagePort的方法了。

這個是屬于SharedWorkerGlobalScope的,可以把文章網(wǎng)上翻翻,就可以看到了。

總結(jié)

通過這次分析SharedWorkerGlobalScope之后,我們對SharedWorker的使用就不會陌生了;

它的使用和Worker是一樣的,不同是他們的全局作用域不同,只是會有一些特定的方法,都是WorkerGlobalScope的子類,所以它可以使用WorkerGlobalScope的所有方法。

也通過這次分析,我們認識到MessagePort、MessageChannel,這些都是SharedWorker的基礎(chǔ)也是核心,它們之間的關(guān)系也是非常重要的。

而且認識到MessagePort、MessageChannel之后,其實跨頁面通信也可以使用它們,也可以使用它們來做一些其他的事情,這些就看自己的想象力了。

以上就是SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析的詳細內(nèi)容,更多關(guān)于SharedWorkerGlobalScope屬性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java抽象的本質(zhì)解析

    Java抽象的本質(zhì)解析

    對于面向?qū)ο缶幊虂碚f,抽象是它的一大特征之一,在 Java 中可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)抽象的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Springboot集成阿里云OSS上傳文件系統(tǒng)教程

    Springboot集成阿里云OSS上傳文件系統(tǒng)教程

    這篇文章主要介紹了Springboot集成阿里云OSS上傳文件系統(tǒng)教程,通過詳細的圖文展示,代碼步驟的展示和文件配置信息,希望對你有所幫助
    2021-06-06
  • Mybatis中的resultType和resultMap查詢操作實例詳解

    Mybatis中的resultType和resultMap查詢操作實例詳解

    resultType是直接表示返回類型的,而resultMap則是對外部ResultMap的引用,resultMap解決復(fù)雜查詢是的映射問題。這篇文章主要介紹了Mybatis中的resultType和resultMap查詢操作實例詳解,需要的朋友可以參考下
    2016-09-09
  • 如何基于js及java分析并封裝排序算法

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

    這篇文章主要介紹了如何基于js及java分析并封裝排序算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • java?MongoDB實現(xiàn)列表分頁查詢的示例代碼

    java?MongoDB實現(xiàn)列表分頁查詢的示例代碼

    本文主要介紹了java?MongoDB實現(xiàn)列表分頁查詢的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 詳解SpringBoot讀取Yml配置文件的3種方法

    詳解SpringBoot讀取Yml配置文件的3種方法

    本文主要介紹了詳解SpringBoot讀取Yml配置文件的3種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Java實現(xiàn)花卉管理系統(tǒng)

    Java實現(xiàn)花卉管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)花卉管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java實現(xiàn)簡單棋盤存檔和讀取功能

    Java實現(xiàn)簡單棋盤存檔和讀取功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單棋盤存檔和讀取功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼

    java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼

    這篇文章主要介紹了java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼的相關(guān)資料,這里附實例代碼,幫助到大家學習理解,需要的朋友可以參考下
    2016-11-11
  • 一文詳解Java線程的6種狀態(tài)與生命周期

    一文詳解Java線程的6種狀態(tài)與生命周期

    一個線程在給定的時間點只能處于一種狀態(tài)。線程可以有6種狀態(tài):New、Runnable、Blocked、Waiting、Timed?waiting和Terminated。本文將詳細講解這6種狀態(tài),需要的可以參考一下
    2022-05-05

最新評論