0

0

浅谈js解决多线程 webWorker介绍(图文教程)

亚连

亚连

发布时间:2018-05-18 16:04:59

|

4327人浏览过

|

来源于php中文网

原创

由于javascript不支持多线程,所以无法去像java一样用代码控制和创建一个后台进程。因此,在项目的优化时候就遇到了很难解决的问题。

AJAX与webWorker结合

在项目中,我需要在用户进到某个账号时需要同时展示聊天列表和好友列表! 
问题分析: 
如果好友数量比较少的话,那么问题很简单!直接ajax加载就好了! 
但是!这个人际关系复杂的社会怎么可能没有好友上万的人呢!所以,直接加载显然是不行的! 
先说说某web聊天网页的做法!分页加载,在用户滚动滑轮或滚动条时候加载之后的一段好友列表。这也是最常用的方法。 
而面对这个问题,如果先加载聊天列表,再点击好友列表再加载好友列表的话就会出现两次加载的现象! 
因此,需要在加载聊天列表同时加载一段好友列表,这样就不会出现两次加载的现象! 
这样就会有另一个问题!两个请求需要最快的请求回来! 
首先,看一下两种方法的请求速度! 

20171020130130469.png

这是两个ajax先后同时请求! 

20171020130253621.png这是webworker实现两个请求! 
好吧!看下代码!

index.js
    worker =  new Worker("/static/js/worker.js");    //最好先判断浏览器是否支持worker,我的项目用的是谷歌,所以就不判断了!
    //最好不要反复创建worker 因为worker是开辟了一个新空间
    worker.postMessage({
        type:"all",
        id:id
    });    //发送消息到worker.js中
    worker.addEventListener("message",function(e){
        console.log("接收消息",e.data.content);
})//监听worker发回来的消息!1234567891011121314
worker.js
onmessage = function (event){//监听消息
    console.log("worker.event.data:",event.data);    var postStr ="par_ser="+event.data.id;    var url ="";    if(event.data.type == "all"){
        url = "/api/getwxinfo/getCustomer";
    }else if(event.data.type == "char"){
        url = "/api/getwxinfo/getchating";
        postStr = postStr+"&num="+event.data.num;
    }    var xmlhttp=new XMLHttpRequest();    var content = "";
         xmlhttp.open('POST',url,true);
         xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
         xmlhttp.send(postStr);
         xmlhttp.onreadystatechange = function(){            if(xmlhttp.readyState==4 && xmlhttp.status==200){
                content = xmlhttp.responseText;                self.postMessage({                type:event.data.type,
                content : content
                });
            }
         }
}

在页面上任何开销比较大的算法或者请求,都可以放到worker中进行计算之后再传回主js中。

Gears解决worker兼容性

在解决worker兼容性时,ie,火狐等浏览器不支持worker API, 
因此找到了这个Gears。它是谷歌的插件,使用起来和workerAPI差不多!给个小实例:

Gears.jsvar worker = google.gears.factory.create('beta.workerpool');//创建worker Pool,之后创建workerworker.onmessage = function(e){
    console.log(e.body);
}//创建workervar workerid = worker.createWorkerFromUrl("js/GearsWorker.js");//发送信息到worker中worker.sendMessage(getValueToDecrypt(),workerid);123456789
GearsWorker.jsvar workerpool = google.gears.workerPool;
workerpool.onmessage = function(e){
 //把值回传主进程    workerpool.sendMessage(decryptedValue,e,sender);}

不用worker可以怎么做?

Anyword
Anyword

AI文案写作助手和文本生成器,具有可预测结果的文案 AI

下载

这里做个最普通的方法介绍:计时器 
可以将计算量很大的地方封装成一个代码块,用计时器控制其执行。但是以这种方式可能不是那么简单,所以不推荐了!

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

JS+HTML5做出鼠标绑定粒子流动画

JS怎么做出雪花飘落动画

Node.Js实现端口重用步骤详解

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号