多线程 work

最后更新于:2022-04-02 03:27:14

[TOC] > [阮一峰参考网站](http://javascript.ruanyifeng.com/htmlapi/webworker.html#toc2) **注意事项:** 1. 同源限制 分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。 2. DOM 限制 Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象。但是,Worker 线程可以navigator对象和location对象。 3. 通信联系 Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。 4. 脚本限制 Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。 5. 文件限制 Worker 线程无法读取本地文件,即不能打开本机的文件系统 `file://`,它所加载的脚本,必须来自网络。 ## 示例 ### 简单demo ``` // Public/Admin/js/work.js console.log("hello word"); // index.html //由于 Worker 不能读取本地文件,所以这个脚本必须来自网络 var worker =new Worker('/Public/Admin/js/work.js'); // 输出 hello world ``` ### 主进程与子进程交互demo `index.html`内容 ``` var worker =new Worker('http://192.168.0.70:8000/Public/Admin/js/work.js'); //1.主进程推送给子进程 可以使对象或者字符串等 worker.postMessage({method: 'echo', args: ['Work']}); //4.接受子进程过来的数据 worker.onmessage = function (event) { //可以在此处使用jquery $("body").css('background-color','red'); console.log('Received message ' + event.data); } ``` `work.js`内容 ``` //2.把数处理后的程序发送给主进程 self.addEventListener('message', function (e) { //3.子进程处理传入的参数 self.postMessage('You said: ' + e.data); //e.data 就是传入的数据 }, false); ``` ## work 进程识别主进程的不同处理 ``` self.addEventListener('message', function (e) { var data = e.data; switch (data.cmd) { case 'start': self.postMessage('WORKER STARTED: ' + data.msg); break; case 'stop': self.postMessage('WORKER STOPPED: ' + data.msg); self.close(); // Terminates the worker. break; default: self.postMessage('Unknown command: ' + data.msg); }; }, false); ```
';