WebWorker

webWorker



web worker 产生原因

众所周知,JavaScript是单线程工作的,如果涉及到密集计算(比如,md5的计算)、延时、异步的任务,通常都是通过setTimeout、promise、XMLHttpRequest实现。

但本质上,它们都是处于一个线程中工作,仍然会对主线程造成阻塞,容易造成页面长时间白屏。


web worker 的实现

web worker 分为三种类型,分别为:
○ 专用 Worker
○ 共享 Worker
○ Service Worker

专用 Worker

专用worker是只能和构造的进行通信,worker中的全局作用域为DedicatedWorkerGlobalScope。

// main.ts
// 兼容
if (!window.Worker) return;
const worker = new Worker("worker.js");

// worker 发送消息
worker.postMessage({
  data: "hello, worker.js"
});

// worker 发送消息
worker.onmessage = function (e) {
  // e.data 为消息体
  worker.terminate(); // 关闭进程
}

// 处理错误
worker.onerror = function (e) {
  // e.data 为消息体
  worker.terminate(); // 关闭进程
}

// work.js
onmessage = function (e) {
  // to do ...
  let workerResult = "Result from worker: " + e.data;
  console.log("Posting message back to main script");
  postMessage(workerResult);
}

共享 Worker

共享worker可以为不同的浏览器上下文提供服务,可以是不同的窗口、iframe或者是worker,各个创建者共享worker的实例,全局作用域为SharedWorkerGlobalScope。

// main.js
let shareWorker = new SharedWorker("shareWorker.js");
shareWorker.port.start();
shareWorker.port.postMessage({
    data: "hello, shareWorker.js"
});
share.port.onmessage = function (event) {
  console.log("receive", event.data);
};

// sharework.js
onconnect = function(e) {
  var port = e.ports[0];
  port.onmessage = function(e) {
    port.postMessage('my name is shareWorker');
  }
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raccom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值