Web Worker 的作用陷遮,就是為 JavaScript 創(chuàng)造多線程環(huán)境蟀架,允許主線程創(chuàng)建 Worker 線程兑障,將一些任務(wù)分配給后者運行。在主線程運行的同時登淘,Worker 線程在后臺運行箫老,兩者互不干擾。等到 Worker 線程完成計算任務(wù)黔州,再把結(jié)果返回給主線程耍鬓。這樣的好處是,一些計算密集型或高延遲的任務(wù)流妻,被 Worker 線程負(fù)擔(dān)了牲蜀,主線程(通常負(fù)責(zé) UI 交互)就會很流暢,不會被阻塞或拖慢绅这。
Worker 線程一旦新建成功涣达,就會始終運行,不會被主線程上的活動(比如用戶點擊按鈕证薇、提交表單)打斷度苔。這樣有利于隨時響應(yīng)主線程的通信。但是浑度,這也造成了 Worker 比較耗費資源寇窑,不應(yīng)該過度使用,而且一旦使用完畢箩张,就應(yīng)該關(guān)閉甩骏。
Web Worker 有以下幾個使用注意點。
(1)同源限制
分配給 Worker 線程運行的腳本文件伏钠,必須與主線程的腳本文件同源横漏。
(2)DOM 限制
Worker 線程所在的全局對象,與主線程不一樣熟掂,無法讀取主線程所在網(wǎng)頁的 DOM 對象缎浇,也無法使用document、window赴肚、parent這些對象素跺。但是二蓝,Worker 線程可以navigator對象和location對象。
(3)通信聯(lián)系
Worker 線程和主線程不在同一個上下文環(huán)境指厌,它們不能直接通信刊愚,必須通過消息完成。
(4)腳本限制
Worker 線程不能執(zhí)行alert()方法和confirm()方法踩验,但可以使用 XMLHttpRequest 對象發(fā)出 AJAX 請求鸥诽。
(5)文件限制
Worker 線程無法讀取本地文件,即不能打開本機(jī)的文件系統(tǒng)(file://)箕憾,它所加載的腳本牡借,必須來自網(wǎng)絡(luò)。
如何使用:
1袭异、主線程采用new命令钠龙,調(diào)用Worker()構(gòu)造函數(shù),新建一個 Worker 線程御铃。
var worker = new Worker('work.js');
Worker()構(gòu)造函數(shù)的參數(shù)是一個腳本文件碴里,該文件就是 Worker 線程所要執(zhí)行的任務(wù)。由于 Worker 不能讀取本地文件上真,所以這個腳本必須來自網(wǎng)絡(luò)咬腋。如果下載沒有成功(比如404錯誤),Worker 就會默默地失敗谷羞。
然后帝火,主線程調(diào)用worker.postMessage()方法,向 Worker 發(fā)消息湃缎。
worker.postMessage('Hello World');
worker.postMessage({method: 'echo', args: ['Work']});
worker.postMessage()方法的參數(shù)犀填,就是主線程傳給 Worker 的數(shù)據(jù)。它可以是各種數(shù)據(jù)類型嗓违,包括二進(jìn)制數(shù)據(jù)九巡。
接著,主線程通過worker.onmessage指定監(jiān)聽函數(shù)蹂季,接收子線程發(fā)回來的消息冕广。
worker.onmessage = function (event) {
console.log('Received message ' + event.data);
doSomething();
}
function doSomething() {
// 執(zhí)行任務(wù)
worker.postMessage('Work done!');
}
上面代碼中,事件對象的data屬性可以獲取 Worker 發(fā)來的數(shù)據(jù)偿洁。
Worker 完成任務(wù)以后撒汉,主線程就可以把它關(guān)掉。
worker.terminate();