最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

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

SharedWorkerGlobalScope

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

SharedWorker中可以使用self關(guān)鍵字來(lái)訪問(wèn)SharedWorkerGlobalScope的實(shí)例,也可以使用this關(guān)鍵字來(lái)訪問(wèn)SharedWorkerGlobalScope的實(shí)例。

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

SharedWorkerGlobalScope的屬性

SharedWorkerGlobalScope的屬性大多數(shù)和DedicatedWorkerGlobalScope一樣,只是少了onmessageonerror,因?yàn)?code>SharedWorkerGlobalScope是多個(gè)DedicatedWorkerGlobalScope共享的,所以SharedWorkerGlobalScopeonmessageonerror是多個(gè)DedicatedWorkerGlobalScope共享的。

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

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

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

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

DedicatedWorkerGlobalScope是通過(guò)postMessage來(lái)與DedicatedWorkerGlobalScope通信的,而SharedWorkerGlobalScope是通過(guò)onconnect來(lái)與DedicatedWorkerGlobalScope通信的。

SharedWorkerGlobalScopeonconnect事件會(huì)返回一個(gè)MessagePort,它是一個(gè)雙向的通信通道,可以通過(guò)它來(lái)與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來(lái)監(jiān)聽事件。

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

不同于DedicatedWorkerGlobalScope的是,MessagePort是雙向的,或者說(shuō)MessagePort是雙向的一邊,兩個(gè)MessagePort形成一個(gè)雙向的通信通道。

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

Channel Messaging API

Channel Messaging API允許我們創(chuàng)建一個(gè)雙向的通信通道,它的實(shí)例是MessageChannel,它的原型是EventTarget,它的構(gòu)造函數(shù)是MessageChannel。

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

可以看到MessageChannel有兩個(gè)只讀屬性,分別是port1port2,它們都是MessagePort的實(shí)例,它們之間形成一個(gè)雙向的通信通道。

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

上面的代碼中,channel.port1channel.port2是一個(gè)雙向的通信通道,它們之間可以互相通信。

當(dāng)然通常我們不會(huì)這樣使用MessageChannel,那可以用來(lái)做什么呢,我們可以實(shí)現(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),而不是簡(jiǎn)單的拷貝引用。

SharedWorker

當(dāng)我們了解了SharedWorkerGlobalScopeMessagePort、MessageChannel之后,我們對(duì)SharedWorker的使用就不會(huì)陌生了。

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

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

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

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

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

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

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

// 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的方法了。

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

總結(jié)

通過(guò)這次分析SharedWorkerGlobalScope之后,我們對(duì)SharedWorker的使用就不會(huì)陌生了;

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

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

而且認(rèn)識(shí)到MessagePort、MessageChannel之后,其實(shí)跨頁(yè)面通信也可以使用它們,也可以使用它們來(lái)做一些其他的事情,這些就看自己的想象力了。

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

相關(guān)文章

  • 流式圖表拒絕增刪改查之框架搭建過(guò)程

    流式圖表拒絕增刪改查之框架搭建過(guò)程

    這篇文章主要為大家介紹了流式圖表拒絕增刪改查之框架搭建過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Spring Data JPA 關(guān)鍵字Exists的用法說(shuō)明

    Spring Data JPA 關(guān)鍵字Exists的用法說(shuō)明

    這篇文章主要介紹了Spring Data JPA 關(guān)鍵字Exists的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實(shí)現(xiàn)

    Java中的ArrayList是一種基于數(shù)組實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),支持動(dòng)態(tài)擴(kuò)容和隨機(jī)訪問(wèn)元素,可用于實(shí)現(xiàn)順序表等數(shù)據(jù)結(jié)構(gòu)。ArrayList在內(nèi)存中連續(xù)存儲(chǔ)元素,支持快速的隨機(jī)訪問(wèn)和遍歷。通過(guò)學(xué)習(xí)ArrayList的實(shí)現(xiàn)原理和使用方法,可以更好地掌握J(rèn)ava中的數(shù)據(jù)結(jié)構(gòu)和算法
    2023-04-04
  • Java10新特性解讀

    Java10新特性解讀

    這篇文章主要介紹了Java10新特性的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • Java日常記錄之查看Maven本地倉(cāng)庫(kù)的位置

    Java日常記錄之查看Maven本地倉(cāng)庫(kù)的位置

    這篇文章主要介紹了Maven本地倉(cāng)庫(kù)的用途和配置方法,它提供了查看、修改本地倉(cāng)庫(kù)路徑的步驟,包括檢查settings.xml文件、使用Maven命令和查看輸出日志,需要的朋友可以參考下
    2024-12-12
  • Mybatis in條件傳參的三種實(shí)現(xiàn)方式(直接$,List,[])

    Mybatis in條件傳參的三種實(shí)現(xiàn)方式(直接$,List,[])

    這篇文章主要介紹了Mybatis in條件傳參的三種實(shí)現(xiàn)方式(直接$,List,[]),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解決mybatis plus 一對(duì)多分頁(yè)查詢問(wèn)題

    解決mybatis plus 一對(duì)多分頁(yè)查詢問(wèn)題

    這篇文章主要介紹了解決mybatis plus 一對(duì)多分頁(yè)查詢問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法

    使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法

    這篇文章主要介紹了使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • Java輕松實(shí)現(xiàn)表單提交的三種方法

    Java輕松實(shí)現(xiàn)表單提交的三種方法

    在Web開發(fā)中,表單是用戶與網(wǎng)站交互的主要方式之一,本文將詳細(xì)介紹如何在Java中實(shí)現(xiàn)表單提交,并通過(guò)代碼和案例為新手朋友提供詳細(xì)的指導(dǎo),有需要的可以參考下
    2024-10-10
  • Java正則表達(dá)式API邊界匹配

    Java正則表達(dá)式API邊界匹配

    這篇文章主要介紹了Java正則表達(dá)式API邊界匹配,文章圍繞主題展開相應(yīng)的相關(guān)資料,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-06-06

最新評(píng)論

阳朔县| 东城区| 滦南县| 栾川县| 涪陵区| 海城市| 谢通门县| 阿拉善盟| 沧州市| 孟村| 读书| 临清市| 吉木乃县| 舒兰市| 德安县| 久治县| 邵阳县| 贞丰县| 依兰县| 醴陵市| 云林县| 蒙自县| 泊头市| 吉木乃县| 江华| 丹凤县| 邯郸市| 和政县| 河西区| 合山市| 泰州市| 张掖市| 儋州市| 富锦市| 象州县| 龙岩市| 牙克石市| 金沙县| 抚宁县| 长乐市| 裕民县|