JS異步那些事 一 (基礎(chǔ)知識)
JS異步那些事 二 (分布式事件)
JS異步那些事 三 (Promise)
JS異步那些事 四(HTML 5 Web Workers)
JS異步那些事 五 (異步腳本加載)
什么是 Web Worker榜贴?
當(dāng)在 HTML 頁面中執(zhí)行腳本時邢滑,頁面的狀態(tài)是不可響應(yīng)的岖赋,直到腳本已完成井仰。
web worker 是運行在后臺的 JavaScript售碳,獨立于其他腳本礼预,不會影響頁面的性能凡怎。您可以繼續(xù)做任何愿意做的事情:點擊实蓬、選取內(nèi)容等等俐东,而此時 web worker 在后臺運行演闭。
創(chuàng)建 web worker 文件
現(xiàn)在,讓我們在一個外部 JavaScript 中創(chuàng)建我們的 web worker调鬓。
在這里,我們創(chuàng)建了計數(shù)腳本补憾。該腳本存儲于 "demo_workers.js" 文件中:
var i=0;
function timedCount()
{
i=i+1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();
以上代碼中重要的部分是 postMessage() 方法 - 它用于向 HTML 頁面?zhèn)骰匾欢蜗ⅰ?/p>
注釋:web worker 通常不用于如此簡單的腳本漫萄,而是用于更耗費 CPU 資源的任務(wù)。
創(chuàng)建 Web Worker 對象
我們已經(jīng)有了 web worker 文件盈匾,現(xiàn)在我們需要從 HTML 頁面調(diào)用它腾务。
下面的代碼檢測是否存在 worker,如果不存在削饵,- 它會創(chuàng)建一個新的 web worker 對象岩瘦,然后運行 "demo_workers.js" 中的代碼:
if(typeof(w)=="undefined")
{
w=new Worker("demo_workers.js");
}
然后我們就可以從 web worker 發(fā)生和接收消息了。
向 web worker 添加一個 "onmessage" 事件監(jiān)聽器:
w.onmessage=function(event){
document.getElementById("result").innerHTML=event.data;
};
當(dāng) web worker 傳遞消息時窿撬,會執(zhí)行事件監(jiān)聽器中的代碼启昧。event.data 中存有來自 event.data 的數(shù)據(jù)。
終止 Web Worker
當(dāng)我們創(chuàng)建 web worker 對象后劈伴,它會繼續(xù)監(jiān)聽消息(即使在外部腳本完成之后)直到其被終止為止密末。
如需終止 web worker,并釋放瀏覽器/計算機資源跛璧,請使用 terminate() 方法:
w.terminate();
完整的 Web Worker 實例代碼
我們已經(jīng)看到了 .js 文件中的 Worker 代碼严里。下面是 HTML 頁面的代碼:
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<br /><br />
<script>
var w;
function startWorker()
{
if(typeof(Worker)!=="undefined")
{
if(typeof(w)=="undefined")
{
w=new Worker("demo_workers.js");
}
w.onmessage = function (event) {
document.getElementById("result").innerHTML=event.data;
};
}
else
{
document.getElementById("result").innerHTML="Sorry, your browser does not support Web Workers...";
}
}
function stopWorker()
{
w.terminate();
}
</script>
</body>
</html>
本文參考w3cschool中HTML 5 Web worker的解釋