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

WebWorker是什么鬼?

移動開發
前端工程師們一定有過這樣的體驗,當一個頁面加載了大量的 js 文件時,用戶界面可能會短暫地“凍結”。這很好理解,因為 js 是單線程的語言。我們再走的極端點,一段 js 中出現了 while(){} 的死循環,這時再去點擊頁面的 DOM 元素,將不會觸發事件,事實上,這些異步的事件都排成了隊列,只等頁面的 js 渲染完后去執行(從setTimeout談JavaScript運行機制),而此時渲染進入了死循環,所以出現了用戶界面被“凍結”的現象。

前言

前端工程師們一定有過這樣的體驗,當一個頁面加載了大量的 js 文件時,用戶界面可能會短暫地“凍結”。這很好理解,因為 js 是單線程的語言。我們再走的極端點,一段 js 中出現了 while(){} 的死循環,這時再去點擊頁面的 DOM 元素,將不會觸發事件,事實上,這些異步的事件都排成了隊列,只等頁面的 js 渲染完后去執行(從setTimeout談JavaScript運行機制),而此時渲染進入了死循環,所以出現了用戶界面被“凍結”的現象。

而實際的開發中,雖然不會出現類似的死循環,但是大量的 js 渲染還是會影響用戶體驗的,此時我們希望這段耗時的 js ***能異步去執行,setTimeout 是一個好的方法,但是 H5 提供了更好的辦法,Web Worker! Web Worker 規范通過讓 Javascript 在后臺運行解決了這個問題。瀏覽器實現 Web Worker 規范的方式有很多種,可以使用線程、后臺進程或者運行在其他處理器核心上的進程,等等。具體的實現細節其實沒有那么重要,重要的是開發人員現在可以放心地運行 Javascript,而不必擔心會影響用戶體驗了。

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

如果沒有 Worker

我們來看這樣一段代碼:

  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> 

頁面上寫了一個 div,然后監聽了它的 click 事件,并且在 js 中需要計算斐波那契數列的第 36 項,并將它輸出。這樣的頁面用戶體驗是非常差的,如果 fibonacci 不執行完,div 的 click 事件是無法及時響應的,而遞歸求解斐波那契數列項是相當耗時的!這樣一段耗時的 js 代碼,交給 worker 來做正合適!

祭出大殺器 Worker

Worker 的使用方法很簡單。

實例化 Worker 對象并傳入要執行的 Javascript 文件名就可以創建一個新的 Web Worker:

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

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

  1. worker.postMessage(36); 

我們來看看 Worker 是怎么接收消息的。當頁面在 worker 對象上調用 postMessage()時,數據會以異步方式傳遞給 worker,進而觸發 worker 中的 message 事件。為了處理來自頁面的數據,同樣也要創建一個 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); 

頁面可以傳數據給 Worker,Worker 當然也可以回傳,頁面通過 message 事件進行監聽:

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

Worker 是通過 message 和 error 事件與頁面通信的。來自 Worker 的數據保存在 event.data 中。Worker 不能完成給定的任務時會觸發 error 事件。具體來說,Worker 內部的 Javascript 在執行過程中只要遇到錯誤,就會觸發 error 事件。發生 error 事件時,事件對象中包含三個屬性:filename、lineno 和 message,分別表示錯誤的文件名、代碼行號和完整的錯誤信息:

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

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

完整代碼:

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); 

簡單小結:

WEB主線程:

  1. 通過 var worker = new Worker(url) 加載一個 js 文件來創建一個 worker,同時返回一個 worker 實例。
  2. 通過 worker.postMessage(data) 方法來向 worker 發送數據。
  3. 綁定 worker.onmessage 方法來接收 worker 發送過來的數據。
  4. 可以使用 worker.terminate() 來終止一個 worker 的執行。

worker新線程:

  1. 綁定 onmessage 方法來接收主線程發送過來的數據。
  2. 通過 postMessage(data) 方法來向主線程發送數據。
  3. 可以使用 self.close() 來終止一個 worker 的執行。

Worker 其他

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

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

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

責任編輯:倪明 來源: 博客園
相關推薦

2021-11-10 12:13:02

HostonlyCookie瀏覽器

2017-04-03 15:35:13

知識體系架構

2020-09-27 06:53:57

MavenCDNwrapper

2015-03-17 10:13:52

HTML5什么鬼

2021-07-06 10:17:07

Python LaunLinuxWindows

2019-10-30 10:13:15

區塊鏈技術支付寶

2020-11-04 13:01:38

FastThreadLocalJDK

2022-01-12 12:35:36

Linuxworkqueue工作隊列

2015-09-29 09:47:14

2019-01-07 12:40:19

2015-09-22 09:25:16

RTORPO災備技術

2021-01-07 05:22:47

MySQL字段存儲

2022-09-07 08:41:57

SpringIstio分布式

2015-07-16 10:49:31

虛擬化容器技術

2019-01-17 14:35:01

2018-01-16 08:47:23

2016-10-21 09:58:19

WindowsKMSOEM系統

2015-05-21 15:45:13

2022-03-15 10:38:14

數字孿生遠程醫療數字化

2021-12-14 10:25:59

元宇宙技術Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人高清网站 | 精品国产欧美一区二区 | 日本污视频 | 欧美中文字幕在线观看 | 成人免费黄视频 | 天天干免费视频 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 久久久免费少妇高潮毛片 | 888久久久 | 精品久久久久一区二区国产 | 手机av免费在线 | 日韩一区二区在线视频 | 国产精品久久在线观看 | 国产免费av在线 | 国产在线精品一区二区 | 国产精品久久久久久婷婷天堂 | 99久久婷婷国产综合精品首页 | 精品亚洲一区二区三区 | 国产一级免费视频 | 欧州一区二区三区 | 日韩一区二区三区av | 日批av| 天天影视亚洲综合网 | 午夜午夜精品一区二区三区文 | 久久综合久久久 | 欧美在线综合 | 日韩精品在线播放 | 久久久久久久一区二区三区 | 午夜视频网站 | 一区二区亚洲 | 亚洲一区二区三区在线播放 | 日本中文字幕在线观看 | 看亚洲a级一级毛片 | 国产福利网站 | 国产99久久精品一区二区永久免费 | 国产免费一区 | 91麻豆精品国产91久久久资源速度 | 精品一区二区三区四区视频 | 亚洲精品自在在线观看 | 日韩视频在线一区二区 | 美女视频黄的 |