WebWorker(js中的多线程)

86 阅读1分钟

webWorker学习地址

掘金学习webWorker地址

单线程:同一时间只能干一件事情

多线程:同一时间可以干多件事情

WebWorker是为了JavaScript创造多线程环境,允许主线程创建Worker线程,将一些任务分配给后者运行。在主线程运行的同时,Worker线程在后台运行,两者互不干扰。 若存在大量运算时,可以把运算任务交给Worker线程,当Woker线程计算完成了,再把结果返回给js主线程,从而减少阻塞时间,也提高了运行效率,页面流畅度和用户体验效果也提高了。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var worker = new Worker("./work.js")
    worker.onmessage = function (e) {
      console.log(e.data)
    }
  </script>
</body>
</html>
setTimeout(()=>{
  console.log("test worker")
},2000)
self.postMessage("work")

接收

// 方法1:
worker.onmessage = function (e) {
      console.log(e.data)
}

// 方法2:
worker.addEventListener('message', e => {
      console.log(e.data)
});

终止worker,调用terminate()方法

方法1:

// 写在index.html中
worker.terminate()

方法2:

// 可以在worker.js中直接调用close方法
self.close();

处理错误:

当worker出现运行中错误时

worker.onerror = function (err) {
      console.log(err)
}
worker.onmessageerror = function (err) {
      console.log(err)
}
worker.addEventListener('error', err => {
      console.log(err.message);
});
worker.addEventListener('messageerror', err => {
      console.log(err.message)
});

webWorker的数据传递

主线程和Worker有三种传递数据的方式,structedClone(结构化克隆算法)、Transferable object(可转移对象)、sharedArrayBuffer(共享内存),都是通过postMessage()发送数据,通过监听message事件接收消息。