web worker sharedWorker


// 主进程代码 let w1 = new Worker('./js/my.js') w1.addEventListener('message',function(evt){ console.log('evt',evt.data) }) w1.postMessage('main path message')
// 子进程代码(my.js文件)

// 给主进程发送消息
this.postMessage('the result is 100')

// 接受主进程消息(方法一)
// this.onmessage = ret => {
//     console.log(ret.data)
// }
// 接受主进程消息(方法二)
this.addEventListener('message',function(evt){
        console.log(evt.data)
        // 关闭自己进程
        this.close()
})

 Web Worker 有以下几个使用注意点:

(1)同源限制

分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。

(2)DOM 限制

Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用documentwindowparent这些对象。但是,Worker 线程可以navigator对象和location对象。

(3)通信联系

Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。

(4)脚本限制

Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。

(5)文件限制

Worker 线程无法读取本地文件,即不能打开本机的文件系统(file://),它所加载的脚本,必须来自网络。

Web Worker 通常应用于哪些方面呢?
处理密集型数学计算
大数据集排序
数据处理(压缩、音频分析、图像处理等)
高流量网络通信
 
实例:
Worker 线程完成轮询
有时,浏览器需要轮询服务器状态,以便第一时间得知状态改变。这个工作可以放在 Worker 里面。
 
sharedWorker:共享线程,同源策略下,多个运行环境共用同一个线程,包括数据。
 
// 共享线程的JS文件 (my.js文件)

var a = 1;
onconnect = function (e) {
    var port = e.ports[0];
    port.onmessage = function () {
        port.postMessage(a++)
    }
}
// html文件(index.html)

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>worker demo</title></head>
<body>
    <div> <h1>使用shared worker:</h1> </div>
    <button style="padding: 10px; margin: 10px 0;">点击一下</button>
    <div><span>点了 <span class="time">-</span> 下</span></div>
    <iframe src="index2.html" width='500px' height="400px"></iframe>
    <script>
        let button = document.querySelector('button');
        let worker = new SharedWorker('worker.js');
        worker.port.start();
        let time;
        button.addEventListener('click', function () {
            worker.port.postMessage('start');
        });
        let timeDom = document.querySelector('.time');
        worker.port.onmessage = function (val) {
            timeDom.innerHTML = val.data
        }
    </script>
</body>
</html>
// html文件(index2.html)
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>worker demo</title></head>
<body>
    <div><h1>使用shared  worker:</h1></div>
    <button style="padding: 10px; margin: 10px 0;">点击一下</button>
    <div><span>点了 <span class="time">-</span> 下</span></div>
    <script>
        let button = document.querySelector('button');
        let worker = new SharedWorker('worker.js');
        worker.port.start();
        let time;
        button.addEventListener('click', function () {
            worker.port.postMessage('start');
        });
        let timeDom = document.querySelector('.time');
        worker.port.onmessage = function (val) {
            timeDom.innerHTML = val.data
        }
    </script>
</body>
</html>
 
原文地址:https://www.cnblogs.com/liumingwang/p/13177148.html