成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WebWorker是什么鬼?

移動(dòng)開(kāi)發(fā)
前端工程師們一定有過(guò)這樣的體驗(yàn),當(dāng)一個(gè)頁(yè)面加載了大量的 js 文件時(shí),用戶(hù)界面可能會(huì)短暫地“凍結(jié)”。這很好理解,因?yàn)?js 是單線程的語(yǔ)言。我們?cè)僮叩臉O端點(diǎn),一段 js 中出現(xiàn)了 while(){} 的死循環(huán),這時(shí)再去點(diǎn)擊頁(yè)面的 DOM 元素,將不會(huì)觸發(fā)事件,事實(shí)上,這些異步的事件都排成了隊(duì)列,只等頁(yè)面的 js 渲染完后去執(zhí)行(從setTimeout談JavaScript運(yùn)行機(jī)制),而此時(shí)渲染進(jìn)入了死循環(huán),所以出現(xiàn)了用戶(hù)界面被“凍結(jié)”的現(xiàn)象。

前言

前端工程師們一定有過(guò)這樣的體驗(yàn),當(dāng)一個(gè)頁(yè)面加載了大量的 js 文件時(shí),用戶(hù)界面可能會(huì)短暫地“凍結(jié)”。這很好理解,因?yàn)?js 是單線程的語(yǔ)言。我們?cè)僮叩臉O端點(diǎn),一段 js 中出現(xiàn)了 while(){} 的死循環(huán),這時(shí)再去點(diǎn)擊頁(yè)面的 DOM 元素,將不會(huì)觸發(fā)事件,事實(shí)上,這些異步的事件都排成了隊(duì)列,只等頁(yè)面的 js 渲染完后去執(zhí)行(從setTimeout談JavaScript運(yùn)行機(jī)制),而此時(shí)渲染進(jìn)入了死循環(huán),所以出現(xiàn)了用戶(hù)界面被“凍結(jié)”的現(xiàn)象。

而實(shí)際的開(kāi)發(fā)中,雖然不會(huì)出現(xiàn)類(lèi)似的死循環(huán),但是大量的 js 渲染還是會(huì)影響用戶(hù)體驗(yàn)的,此時(shí)我們希望這段耗時(shí)的 js ***能異步去執(zhí)行,setTimeout 是一個(gè)好的方法,但是 H5 提供了更好的辦法,Web Worker! Web Worker 規(guī)范通過(guò)讓 Javascript 在后臺(tái)運(yùn)行解決了這個(gè)問(wèn)題。瀏覽器實(shí)現(xiàn) Web Worker 規(guī)范的方式有很多種,可以使用線程、后臺(tái)進(jìn)程或者運(yùn)行在其他處理器核心上的進(jìn)程,等等。具體的實(shí)現(xiàn)細(xì)節(jié)其實(shí)沒(méi)有那么重要,重要的是開(kāi)發(fā)人員現(xiàn)在可以放心地運(yùn)行 Javascript,而不必?fù)?dān)心會(huì)影響用戶(hù)體驗(yàn)了。

既然 Worker 是 H5 大家庭的,那么 ie6 之輩就可以一邊去了,詳細(xì)的瀏覽器兼容性可以參考 http://caniuse.com/#search=worker

如果沒(méi)有 Worker

我們來(lái)看這樣一段代碼:

  1. <div style='width:100px;height:100px;background-color:red'></div> 
  2. <script> 
  3.   document.querySelector('div').onclick = function() { 
  4.     console.log('hello world'); 
  5.   }; 
  6.  
  7.   function fibonacci(n) { 
  8.     return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2); 
  9.   } 
  10.  
  11.   console.log(fibonacci(36)); 
  12. </script> 

頁(yè)面上寫(xiě)了一個(gè) div,然后監(jiān)聽(tīng)了它的 click 事件,并且在 js 中需要計(jì)算斐波那契數(shù)列的第 36 項(xiàng),并將它輸出。這樣的頁(yè)面用戶(hù)體驗(yàn)是非常差的,如果 fibonacci 不執(zhí)行完,div 的 click 事件是無(wú)法及時(shí)響應(yīng)的,而遞歸求解斐波那契數(shù)列項(xiàng)是相當(dāng)耗時(shí)的!這樣一段耗時(shí)的 js 代碼,交給 worker 來(lái)做正合適!

祭出大殺器 Worker

Worker 的使用方法很簡(jiǎn)單。

實(shí)例化 Worker 對(duì)象并傳入要執(zhí)行的 Javascript 文件名就可以創(chuàng)建一個(gè)新的 Web Worker:

  1. var worker = new Worker('worker.js'); 

這段代碼會(huì)導(dǎo)致瀏覽器下載 worker.js,但只有 Worker 接收到消息才會(huì)實(shí)際執(zhí)行文件中的代碼。要給 Worker 傳遞消息,可以使用 postMessage() 方法,比如我要告訴 Worker 需要求斐波那契數(shù)列的第 36 項(xiàng):

  1. worker.postMessage(36); 

我們來(lái)看看 Worker 是怎么接收消息的。當(dāng)頁(yè)面在 worker 對(duì)象上調(diào)用 postMessage()時(shí),數(shù)據(jù)會(huì)以異步方式傳遞給 worker,進(jìn)而觸發(fā) worker 中的 message 事件。為了處理來(lái)自頁(yè)面的數(shù)據(jù),同樣也要?jiǎng)?chuàng)建一個(gè) onmessage 事件處理程序。(worker.js 代碼)

  1. self.onmessage = function(event) { 
  2.   var data = event.data; 
  3.   console.log(fibonacci(data)); 
  4. }; 
  5.  
  6. function fibonacci(n) { 
  7.   return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2); 

頁(yè)面可以傳數(shù)據(jù)給 Worker,Worker 當(dāng)然也可以回傳,頁(yè)面通過(guò) message 事件進(jìn)行監(jiān)聽(tīng):

  1. worker.onmessage = function(event) { 
  2.   var data = event.data; 
  3. }; 

Worker 是通過(guò) message 和 error 事件與頁(yè)面通信的。來(lái)自 Worker 的數(shù)據(jù)保存在 event.data 中。Worker 不能完成給定的任務(wù)時(shí)會(huì)觸發(fā) error 事件。具體來(lái)說(shuō),Worker 內(nèi)部的 Javascript 在執(zhí)行過(guò)程中只要遇到錯(cuò)誤,就會(huì)觸發(fā) error 事件。發(fā)生 error 事件時(shí),事件對(duì)象中包含三個(gè)屬性:filename、lineno 和 message,分別表示錯(cuò)誤的文件名、代碼行號(hào)和完整的錯(cuò)誤信息:

  1. worker.onerror = function(event) { 
  2.   console.log(event.filename, event.lineno, event.message); 
  3. }; 

我們建議使用 worker 時(shí)***寫(xiě)上 error 事件,就像使用 ajax 時(shí)總要寫(xiě)上獲取失敗時(shí)的補(bǔ)救操作一樣。

完整代碼:

html 文件:

  1. <div style='width:100px;height:100px;background-color:red'></div> 
  2. <script> 
  3.   document.querySelector('div').onclick = function() { 
  4.     console.log('hello world'); 
  5.   }; 
  6.  
  7.   var worker = new Worker('worker.js'); 
  8.   worker.postMessage(36); 
  9.   worker.onmessage = function(event) { 
  10.     var data = event.data; 
  11.     console.log(data) 
  12.   }; 
  13.  
  14.   worker.onerror = function(event) { 
  15.     console.log(event.filename, event.lineno, event.message); 
  16.   }; 
  17. </script> 

worker.js 文件:

  1. self.onmessage = function(event) { 
  2.   var data = event.data; 
  3.   var ans = fibonacci(data); 
  4.   this.postMessage(ans); 
  5. }; 
  6.  
  7. function fibonacci(n) { 
  8.   return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2); 

簡(jiǎn)單小結(jié):

WEB主線程:

  1. 通過(guò) var worker = new Worker(url) 加載一個(gè) js 文件來(lái)創(chuàng)建一個(gè) worker,同時(shí)返回一個(gè) worker 實(shí)例。
  2. 通過(guò) worker.postMessage(data) 方法來(lái)向 worker 發(fā)送數(shù)據(jù)。
  3. 綁定 worker.onmessage 方法來(lái)接收 worker 發(fā)送過(guò)來(lái)的數(shù)據(jù)。
  4. 可以使用 worker.terminate() 來(lái)終止一個(gè) worker 的執(zhí)行。

worker新線程:

  1. 綁定 onmessage 方法來(lái)接收主線程發(fā)送過(guò)來(lái)的數(shù)據(jù)。
  2. 通過(guò) postMessage(data) 方法來(lái)向主線程發(fā)送數(shù)據(jù)。
  3. 可以使用 self.close() 來(lái)終止一個(gè) worker 的執(zhí)行。

Worker 其他

關(guān)于 Web Worker,最重要的是要知道它所執(zhí)行的 Javascript 代碼完全在另一個(gè)作用域中,與當(dāng)前網(wǎng)頁(yè)中的代碼不共享作用域。在 Web Worker 中,同樣有一個(gè)全局對(duì)象(worker 對(duì)象本身,this 和 self 引用的都是 worker 對(duì)象本身)和其他對(duì)象以及方法。Web Worker 中的代碼不能訪問(wèn) DOM。那么 Worker 里的代碼能訪問(wèn)哪些對(duì)象,擁有哪些方法?

  1. 最小化 的navigator 對(duì)象,包括 onLine、appName、appVersion、userAgent 和 platform 屬性
  2. 只讀的 location 對(duì)象
  3. setTimeout()、setInterval()、clearTimeout()、clearInterval() 方法
  4. XMLHttpRequest 構(gòu)造函數(shù)

任何時(shí)候都能中止 Worker。在 worker.js 中,我們可以用 self.close()方法,而在頁(yè)面中,我們可以用 worker.terminal()方法,這時(shí) error 和 message 事件也不會(huì)觸發(fā)了。

責(zé)任編輯:倪明 來(lái)源: 博客園
相關(guān)推薦

2021-11-10 12:13:02

HostonlyCookie瀏覽器

2017-04-03 15:35:13

知識(shí)體系架構(gòu)

2020-09-27 06:53:57

MavenCDNwrapper

2021-07-06 10:17:07

Python LaunLinuxWindows

2019-10-30 10:13:15

區(qū)塊鏈技術(shù)支付寶

2015-03-17 10:13:52

HTML5什么鬼

2015-09-29 09:47:14

2022-01-12 12:35:36

Linuxworkqueue工作隊(duì)列

2020-11-04 13:01:38

FastThreadLocalJDK

2019-01-07 12:40:19

2021-01-07 05:22:47

MySQL字段存儲(chǔ)

2022-09-07 08:41:57

SpringIstio分布式

2015-09-22 09:25:16

RTORPO災(zāi)備技術(shù)

2015-07-16 10:49:31

虛擬化容器技術(shù)

2019-01-17 14:35:01

2016-10-21 09:58:19

WindowsKMSOEM系統(tǒng)

2018-01-16 08:47:23

2022-03-15 10:38:14

數(shù)字孿生遠(yuǎn)程醫(yī)療數(shù)字化

2015-05-21 15:45:13

2021-12-14 10:25:59

元宇宙技術(shù)Web
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜影视| 黄色av网站在线免费观看 | 精产国产伦理一二三区 | 免费视频99| 国产成人免费视频网站高清观看视频 | 久久精选| 91p在线观看 | 国产一级特黄真人毛片 | 福利视频网站 | 一级二级三级在线观看 | 黄色免费网址大全 | 狠狠操av| 在线看av的网址 | 久久精品二区亚洲w码 | 99国产精品一区二区三区 | 欧美日韩亚洲三区 | 久久久精品综合 | 一级黄片一级毛片 | 国产精品久久久久久久久久东京 | 成人av看片 | 在线一区观看 | 噜噜噜噜狠狠狠7777视频 | 99精品视频一区二区三区 | 国产黄色小视频在线观看 | 性欧美精品一区二区三区在线播放 | 国产成人精品亚洲日本在线观看 | 狠狠狠色丁香婷婷综合久久五月 | 天堂av中文在线 | 精品国产欧美一区二区三区成人 | ww 255hh 在线观看 | 久久国产精品99久久久久久丝袜 | 国产高清在线视频 | 自拍偷拍亚洲视频 | 亚洲综合色视频在线观看 | 日韩一区二区在线视频 | 日韩在线国产 | 国产免费观看久久黄av片涩av | 少妇一区在线观看 | 免费成人高清在线视频 | 无码日韩精品一区二区免费 | 日本久久久一区二区三区 |