SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析
引言
上一章介紹了Worker
的全局作用域,了解到DedicatedWorkerGlobalScope
是繼承自WorkerGlobalScope
的;
這一章介紹的SharedWorkerGlobalScope
也是繼承自WorkerGlobalScope
的,那么SharedWorkerGlobalScope
和DedicatedWorkerGlobalScope
有什么區(qū)別呢?
SharedWorkerGlobalScope
SharedWorkerGlobalScope
和DedicatedWorkerGlobalScope
一樣都是一個全局作用域,它的實例是SharedWorker
,它的原型是WorkerGlobalScope
,它的構(gòu)造函數(shù)是SharedWorkerGlobalScope
。
在SharedWorker
中可以使用self
關(guān)鍵字來訪問SharedWorkerGlobalScope
的實例,也可以使用this
關(guān)鍵字來訪問SharedWorkerGlobalScope
的實例。
他們之間的關(guān)系如上圖所示。
SharedWorkerGlobalScope的屬性
SharedWorkerGlobalScope
的屬性大多數(shù)和DedicatedWorkerGlobalScope
一樣,只是少了onmessage
和onerror
,因為SharedWorkerGlobalScope
是多個DedicatedWorkerGlobalScope
共享的,所以SharedWorkerGlobalScope
的onmessage
和onerror
是多個DedicatedWorkerGlobalScope
共享的。
這里直接通過函數(shù)簽名的方式來介紹SharedWorkerGlobalScope
的屬性。
interface SharedWorkerGlobalScope extends WorkerGlobalScope { readonly name: string; close(): void; onconnect: EventHandler }
name
:SharedWorkerGlobalScope
的名字,它是只讀的,只能在SharedWorker
的構(gòu)造函數(shù)中設(shè)置,如果使用相同的name
創(chuàng)建多個SharedWorker
,那么它們會共享同一個SharedWorkerGlobalScope
。close()
:關(guān)閉SharedWorkerGlobalScope
,它會丟棄所有的等待執(zhí)行的任務(wù)。onconnect
:當有新的DedicatedWorkerGlobalScope
連接到SharedWorkerGlobalScope
時,會觸發(fā)onconnect
事件。
可以對比一下DedicatedWorkerGlobalScope
的屬性,其實相差不大,只是少了onmessage
和onerror
,多了onconnect
。
數(shù)據(jù)共享
DedicatedWorkerGlobalScope
是通過postMessage
來與DedicatedWorkerGlobalScope
通信的,而SharedWorkerGlobalScope
是通過onconnect
來與DedicatedWorkerGlobalScope
通信的。
SharedWorkerGlobalScope
的onconnect
事件會返回一個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
形成一個雙向的通信通道。
MessagePort
是Channel 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
有兩個只讀屬性,分別是port1
和port2
,它們都是MessagePort
的實例,它們之間形成一個雙向的通信通道。
const channel = new MessageChannel(); channel.port1.onmessage = (event) => { console.log(event.data); }; channel.port2.postMessage('hello');
上面的代碼中,channel.port1
和channel.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
當我們了解了SharedWorkerGlobalScope
、MessagePort
、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
:是MessagePort
的onmessage
事件worker.port.start()
:是MessagePort
的start
方法worker.port.postMessage
:是MessagePort
的postMessage
方法
通過上面的代碼就可以推斷出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)文章
Springboot集成阿里云OSS上傳文件系統(tǒng)教程
這篇文章主要介紹了Springboot集成阿里云OSS上傳文件系統(tǒng)教程,通過詳細的圖文展示,代碼步驟的展示和文件配置信息,希望對你有所幫助2021-06-06Mybatis中的resultType和resultMap查詢操作實例詳解
resultType是直接表示返回類型的,而resultMap則是對外部ResultMap的引用,resultMap解決復(fù)雜查詢是的映射問題。這篇文章主要介紹了Mybatis中的resultType和resultMap查詢操作實例詳解,需要的朋友可以參考下2016-09-09java?MongoDB實現(xiàn)列表分頁查詢的示例代碼
本文主要介紹了java?MongoDB實現(xiàn)列表分頁查詢的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07