• Web Worker


    Web Worker提供了一个接口,该接口提供了一种单独创建独立线程的方式。而不影响UI线程

    最简单的使用

    在js文件中

    1 var myWorker=new Worker("worker.js");
    2 myWorker.addEventListener('message',function(e){
    3    alert(e.data);
    4 })

    在worker.js中

    1 var num=0;
    2 for(var i=-;i<1000;i++){
    3    num++;
    4 }
    5 postMessage(num);

    2个线程之间可以通过postMessage()进行通信,但传递的类容只能是被序列化的数据,不能传递普通的js对象

     新创建的线程和原始线程的区别
    1:浏览器中全局对象是Window对象,这个对象可以访问DOM和BOM的全部对象,worker线程只能通过this(self)来访问全局对象。并且他可以访问的对象
    是有一定限制的。

    嵌入式WORKER

     1 //脚本不会被js解析,因为type是自创的
     2 <script  type="text/js-worker"  id="worker">
     3   var num=0;
     4   for(var i=0;i<100;i++){
     5      num+=i;
     6   }
     7   self.addEventListener('message',function(e){
     8      self.postMessage(e.data+','+num)l
     9   },false);
    10 </script>
    11 
    12 <script type="text/javascript">
    13 
    14    var code=document.getElementById('worker').textContent;
    15    //构建二进制对象,第一个是数组,第二个是对象参数
    16    var blob=new Blob([code],{type:"text/javascript"});
    17    //window.URL.createObjectURL(blob)用来创建一个简单的网址字符串。
    18    var myWorker=new Worker(window.URL.createObjectURL(blob));
    19    myWorker.addEventListener('message',function(e){
    20       console.log(e.data);
    21    },false);
    22    myWorker.postMessage('get result');
    23 </script>

    共享worker

    前面的都只为主线程服务叫做专用worker,共享worker被同源的多个页面所共享,可以用于多个页面的数据同步,和若干标签共享一个资源的情况

    创建一个共享worker

    1 var worker=new ShareWorker("worker.js","doSomething")

    接受2个参数 url 和给共享worker取的名字,这个名字可以为同一个js文件创建多个worker实例

    共享worker的实例

    主界面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>共享worker</title>
         <style type="text/css">
             
         </style>
        <script type="text/javascript">
          
            var out=document.getElementById('output');
            var id=(''+Date.now()).substr(-4,4);
            console.log(id);
            document.getElementById('iam').innerHTML='我的编号是'+id;
            var worker=new SharedWorker('shared-worker.js');
            worker.port.addEventListener('message',function(e){
                output.innerHTML+=e.data;
            },false);
            worker.port.start();
              function sayHI(){
                worker.port.postMessage({'cmd':'hi','msg':'大家好!<br>','id':id});
            }
        </script>
    </head>
    <body>
        <span id="iam"></span>
        <button onclick="sayHI()">say hi</button>
        <div id="output"></div>
    </body>
    </html>

    shared-worker.js

     1 var ports=[];
     2 function boradcast(msg){
     3     ports.forEach(function(port){
     4         port.postMessage(msg);
     5     })
     6 }
     7 self.onconnect=function(e){
     8     var newport=e.ports[0];
     9     ports.push(newport);
    10     newport.onmessage=function(e){
    11         if(e.data.cmd=='hi'){
    12             boradcast(e.data.id+'说:'+e.data.msg);
    13         }
    14     }
    15 }
  • 相关阅读:
    xpath取其中几个使用position
    pycharm2018.3.5 下载激活(windows平台)
    switch host 切换本地host
    leveldb 学习记录(四)Log文件
    bittorrent 学习(一) 种子文件分析与bitmap位图
    分布式协议学习笔记(三) Raft 选举自编写代码练习
    谷歌开源的一个BTREE实现 Go语言
    分布式协议学习笔记(二) 日志复制
    分布式协议学习笔记(一) Raft 选举
    利用redis制作消息队列
  • 原文地址:https://www.cnblogs.com/sliuie/p/5160434.html
Copyright © 2020-2023  润新知