webworke

webWorker是h5新增api,该api不会影响浏览器展UI的主线程,而是重新开启一个线程。
在页面中

  1. // 如何传入的是绝对URL,必须是符合通源策略
  2. let webworker = new Worker("./main.js");
  3. console.log(webworker);
  4. // 发送消息给线程
  5. webworker.postMessage('aaa');
  6. // 接受线程消
  7. webworker.onmessage = function(e){
  8. console.log(e.data);
  9. }

WebworkerGlobalScope

webworker的一个新线程,全局对象为self,⚠️:只要message接收到消息,则该工作线程就不会退出。webworker中没有任何属性和方法能告诉我 们工作线程是否还在运行。

  1. // 在worker中 self = this;
  2. self.onmessage = function(e){
  3. console.log(e.data === "aaa");
  4. setTimeout(()=>{
  5. if(e.data === "aaa"){
  6. self.postMessage('我是self ')
  7. }
  8. },1000)
  9. }

webworker中模块导入

由于在有webworker的时候还没有import的模块导入,所以 webworker有自己的模块导入importScript,这种导入模块是同步加载并且执行,如果默认出现错误,后续脚本就不会在加载或执行。

  1. // webworker 中的模块导入
  2. importScripts("./1") // 有点怪怪的。~~导入的是整个文件

MessageChannel

messageChannel是信息管道对象。MessageChannel的onmessage回调属于宏任务
⚠️: 管道通讯需要使用管道的onmessage。

  1. <script>
  2. let worker1 = new Worker("./main.js");
  3. let worker2 = new Worker("./1.js");
  4. console.log(worker1, worker2);
  5. // 创建一个信息通道
  6. let mc = new MessageChannel();
  7. // port1 分配给worker1
  8. // postMessage 参数二 传递所有权
  9. worker1.postMessage({ name: "port1", port: mc.port1 }, [mc.port1]);
  10. worker2.postMessage({ name: "port2", port: mc.port2 }, [mc.port2]);
  11. </script>

main.js

  1. // 暂停1000 后发送消息给port2
  2. self.onmessage = (e) => {
  3. console.log(e.data);
  4. if (e.data.name === "port1") {
  5. const port1 = e.data.port;
  6. // 延时给port2发送消息。
  7. setTimeout(() => {
  8. console.log('12');
  9. port1.postMessage("我是port1,我发送了一个消息")
  10. }, 1000);
  11. // 接受port2发送过来的消息
  12. port1.onmessage = (e)=>{
  13. console.log(e.data);
  14. }
  15. }
  16. }

1.js

  1. // port2 接受到port1的消息后 ,延迟反馈给port1
  2. self.onmessage = (e) => {
  3. if (e.data.name === "port2") {
  4. const port2 = e.data.port;
  5. port2.onmessage = function (portEvent) {
  6. // 延时发送消息给port1
  7. if (portEvent.data) {
  8. setTimeout(() => {
  9. port2.postMessage("我是port2,我发送了一个消息")
  10. }, 1000)
  11. }
  12. }
  13. }
  14. }