菜鳥文檔 web worker 是運行在后臺的 JavaScript,不會影響頁面的性能。
JavaScript 是單線程,一個時期只能做一件事情,做完一件再做一件,就好比一個人做飯,不能邊摘菜邊洗米,必須做完一件再做一件。也就是有排隊的概念。
什么是異步請求?
異步請求就是先發(fā)請求,然后該干嘛干嘛,等到發(fā)的請求有結果了,再執(zhí)行對應的操作,就好比做飯,先把米放到電飯鍋,在等米飯熟的過程中,你可以炒菜,等米飯熟了,再盛出來吃。
所以實際開發(fā)中,多線程和異步請求是能提高網(wǎng)頁性能的。
實際上計時器setInterval和SetTimeout都是異步請求,他們都會排到隊列的后面,就算時間是0,只要出現(xiàn)就是要排到隊列的后面。
所以會有面試問代碼輸出的順序,在計時器里的一定是最后輸出的,就算時間是0,就算寫在最前面,都沒啥用。
所以總結下來
Web Workers 就是多線程執(zhí)行javascript
任務分配下來,它會分配給其他人去做,等到有結果了,接收
比如寒假作業(yè)布置下來, 你直接分配給其他人去做,一個人做語文,一個人做數(shù)學,等他們做完了,你把作業(yè)收回來就行了,這樣你就很輕松了。
步驟:1.分配任務,讓誰執(zhí)行
var w=new Worker("xiaoming.js");//new一下,分配給小明做
2.接收結果 onmessage
w.onmessage=function(e){
console.log(e.data);//e.data就是結果
if(e.data.flag){
w.terminate();//結束進程
}
}
結束進程要慎重,因為有時候不是一次響應就可以,要等到執(zhí)行完才停止,所以要加判斷條件
3.被分配做任務的那個人要發(fā)信息 postMessage,這樣才可以接收到啊
xiaoming.js如下
var total=0;
for(var i=1;i<100;i++){
postMessage({
val:i,
flag:i==99?true:false//意思是當i是99的時候,為true,結束進程
});
total+=i;
}
e.data拿到的就是postMessage括號里面的值。