Web Worker

0. 前言

在一個(gè)頁(yè)面中,會(huì)有許多的耗時(shí)操作,這些耗時(shí)操作會(huì)影響界面的流暢度,可能會(huì)出現(xiàn)卡頓的情況,那么,什么是耗時(shí)操作呢?就是一些耗費(fèi)時(shí)間的操作,比如你的for循環(huán),創(chuàng)建節(jié)點(diǎn)等,當(dāng)然,我說的不是你就只創(chuàng)建一個(gè)節(jié)點(diǎn),就創(chuàng)建一個(gè)節(jié)點(diǎn),耗費(fèi)不了多少時(shí)間,可是,你要?jiǎng)?chuàng)建很多呢?
那我們可以把你所耗時(shí)的那些操作,放在子線程里,等它運(yùn)行完畢,回調(diào)到主線程,相當(dāng)于異步操作,讓子線程的操作進(jìn)行著,主線程該干嘛干嘛去。


主線程和子線程.png

1. 簡(jiǎn)介

Web Worker的基本原理就是在當(dāng)前 javascript 的主線程中,使用 Worker 類加載一個(gè) javascript 文件來(lái)開辟一個(gè)新的線程,也可以說成子線程,起到互不阻塞執(zhí)行的效果。

2. 改進(jìn)前代碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <input type="button" id="box" value="點(diǎn)擊我" />
        <h1 id="num"></h1>
        
        <script type="text/javascript">
            //在子線程 模擬一個(gè)耗時(shí)操作
            for (var i = 0; i < 1000000000; i++) {
                
            }
            num.innerHTML = i;      
            box.onclick = function () {
                alert("哈哈哈哈哈哈");
            }
        </script>
    </body>
</html>
改版前.gif

改版前那個(gè)for循環(huán)耗時(shí)操作,還是要耗費(fèi)時(shí)間的,而且我在連續(xù)點(diǎn)擊,會(huì)彈出很多次,在for循環(huán)結(jié)束后,你點(diǎn)擊了幾次,就會(huì)彈出幾次,以為它被for循環(huán)阻塞住了做成了影響。

3. 改進(jìn)后代碼

主線程
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <input type="button" id="box" value="點(diǎn)擊我" />
        <input type="button" value="停止子線程的耗時(shí)操作" id="stop1" />
        <h1 id="num"></h1>
        
        <script type="text/javascript">
            //創(chuàng)建一個(gè)worker對(duì)象(創(chuàng)建一個(gè)子線程)
            var webworker;
            if (typeof Worker != "undefined") {
                //參數(shù)是耗時(shí)操作
                webworker = new Worker("./webworker.js");
                
                //監(jiān)聽子線程中運(yùn)行的耗時(shí)操作,如果運(yùn)行完畢,
                //回調(diào)到這里(主線程)更新UI代碼
                webworker.onmessage = function (e) {
                    num.innerHTML = e.data;
                }
                
            } else {
                throw new Error ("不支持Worker對(duì)象");
            }
            box.onclick = function () {
                alert("哈哈哈哈哈哈");
            }
            stop1.onclick = function () {
                webworker.terminate();
            }
        </script>
    </body>
</html>

子線程
(function  () {
    //在子線程 模擬一個(gè)耗時(shí)操作
    for (var i = 0; i < 1000000000; i++) {
        
    }
    //耗時(shí)操作完畢后,調(diào)用postMessage方法回到主線程,
    //并且把數(shù)據(jù)傳回去
    postMessage(i);
})();

改進(jìn)后.gif

我把耗時(shí)操作放在另一個(gè)文件里,然后,我主線程該干嘛干嘛,這樣兩者也不會(huì)造成阻塞,流暢度也很好,解決了耗時(shí)操作可能會(huì)造成的阻塞影響。

4. 結(jié)束語(yǔ)

快過新年了,大家都在買著回家的票,而我今天剛買到回家到票,聽說唐山今天下雪了,是不是有句話“瑞雪兆豐年”,哈哈,提前祝大家新年快樂哈,看到的記得給我點(diǎn)贊,發(fā)紅包?。。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容