<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於 JS 是單執行緒的,費時的 JS 操作將會導致整個頁面的阻塞。Web Worker 提供了建立多執行緒的方法,將一些耗時且 UI 無關的工作交給 worker,可提高頁面的使用體驗。
限制:
同源策略:worker 執行緒執行的指令碼要和當前頁面同源
API 限制:
和主執行緒不在一個上下文環境,通訊要通過 postMessage
完成
建立一個子執行緒,要傳入一個指令碼的 URL。如果該指令碼載入失敗,則 Worker 會靜默失敗
const worker = new Worker('url');
如果要在本檔案中描述執行的內容,可以用 Blob 和 window.URL.createObjectURL 生成一個 URL
function createWorker(f) { const blob = new Blob(['(' + f.toString() +')()']); const url = window.URL.createObjectURL(blob); const worker = new Worker(url); return worker; }
worker.postMessage(param);
引數可以是任意型別,包括二進位制資料。但傳遞是拷貝形式而不是參照形式。因此對於巨量資料會存在效能問題。
worker.onmessage = function (event) { console.log('Received message ' + event.data); }
worker.onerror(function (e) { console.log([ 'ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message ].join('')); });
worker.terminate();
子執行緒中無法使用 window,self
代表全域性物件
self.addEventListener('message', function (e) { self.postMessage('Received: ' + e.data); }, false);
self.postMessage('something');
在子執行緒中載入其他指令碼:
importScripts('script1.js', 'script2.js');
self.close();
網路請求是和DOM無關且可能耗時較長的操作,worker執行緒支援使用Fetch,是適合放在worker中進行的操作。
而要在worker中使用fetch,如果每次都要自己處理執行緒間的通訊的話,會十分麻煩,因此我對通訊進行了封裝,寫成了一個可以直接使用的庫。
安裝依賴:
npm i web-worker-fetch
使用時先範例化一個WF物件,然後就可以像使用fetch一樣在worker中使用fetch:
import WebWorkerFetch from "web-worker-fetch"; const wf = new WebWorkerFetch(); wf.fetch("url", { method: "POST", // *GET, POST, PUT, DELETE, etc. mode: "cors", // no-cors, *cors, same-origin cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached credentials: "same-origin", // include, *same-origin, omit headers: { "Content-Type": "application/json" // 'Content-Type': 'application/x-www-form-urlencoded', }, redirect: "follow", // manual, *follow, error referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url body: JSON.stringify(data) // body data type must match "Content-Type" header }).then((res) => console.log(res));
除此之外,借鑑 axios
的思路,設定中可以提供 requestInterceptor
和 responseInterceptor
,對請求引數和返回資料做統一處理
這個庫的封裝主要是解決了兩個問題:
對於第一個問題,主執行緒使用 ostMessage
向worker執行緒傳遞引數。
對於第二個問題,worker執行緒通過 self.postMessage
向主執行緒傳遞訊息,主執行緒通過 worker.onmessage
監聽訊息。
此時就引出了問題所在:如果多次使用 wf.fetch
傳送請求,那麼在一個請求完成後,worker執行緒觸發的訊息將讓所有請求處都認為請求已完成。
因此,在每次請求時,使用一個fetchId確定該請求做唯一性。將該id傳給worker執行緒,後續worker執行緒向主執行緒通訊時也會帶上這個id。
在主執行緒中監聽onmessage事件時,判斷id是否和自己的請求id一致,只有在相同時才做處理。
具體的實現大家可以移步倉庫原始碼,實際上也非常簡單。
以上就是在web worker中使用fetch範例詳解的詳細內容,更多關於web worker使用fetch的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45