快速了解WebWorker

107 阅读1分钟

1.WebWorker是什么?

Web Worker是一种使JavaScript能够在后台线程中执行的浏览器API。

它可以在独立的线程中运行JavaScript代码,而不会阻塞页面的主线程。

2.WebWoker是用来干嘛的?

Web Worker可用于处理耗时的操作,如复杂的计算、大型数据集的处理和网络请求等。

3.WebWorker有什么限制?

每个浏览器的Worker线程数量也是有限制的,超出限制可能导致部分Worker线程被阻塞

直接实战demo.html

WebWorker.gif

直接上代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="box1">
    <input type="number" value="0"/>
    <button onclick="clickHandler('box1')">计算</button>
    <span></span>
  </div>
  <div id="box2">
    <input type="number" value="0" />
    <button onclick="clickHandler('box2')">计算</button>
    <span></span>
  </div>
  <div id="box3">
    <input type="number"  value="0"/>
    <button onclick="clickHandler('box3')">计算</button>
    <span></span>
  </div>
  <script>
    const workerMap={}
    function clickHandler(boxId) {
      let worker = workerMap[boxId]
      if(!worker){
        worker = new Worker('fib_worker.js')
        workerMap[boxId]=worker
        worker.onmessage=(event)=>{
          const boxEl = document.getElementById(boxId);
          const inputEl = boxEl.getElementsByTagName('input')[0];
          const number = inputEl.value;
          const spanEl = boxEl.getElementsByTagName('span')[0];
          spanEl.innerHTML = `${number} fib result is ${event.data}`;
        }
      }
      const boxEl = document.getElementById(boxId);
      const inputEl = boxEl.getElementsByTagName('input')[0];
      const number = inputEl.value;
      worker.postMessage(number)
    }
  </script>
</body>
</html>
function fib(n) {
    if (n < 2) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}
self.onmessage=(event)=>{
    console.info('go workder',event.data)
    const number = event.data
    const result = fib(number)
    self.postMessage(result)
}

4.但是这里直接点开会有一个问题:Uncaught DOMException: Failed to construct 'Worker

因为执行WebWorker 要是网络文件,所以不能直接点开

image.png

5.可以在vscode 安装一个插件

image.png

6.然后这里启动

image.png

7.是这样打开的demo

image.png