理解js单线程异步机制

1.最近在维护一个项目,用到的主要语言是JS。因此在写需求功能时对JS的异步有了进一步的理解。

JS是单线程的,但是JS是可以异步的。

setTimeout(function(){

console.log();

},1000)  执行setTimeout时,会把里面的匿名函数放到callback queue回调函数队列中去,等待主线程的召唤,等执行完主线程再把匿名函数放到stack栈里执行。

用时要注意,别把setTimeout函数放到for循环里,因为等执行完for循环再来执行setTimeout里的匿名函数时,i的下标已经超出数组索引了。

2.缓存

在需要请求大量数据时,可以事先进行请求,然后保存下来,之后页面要用这些数据可以直接读取缓存用,而不用再次请求。

在页面加载的时候我们就开始请求数据,先把请求到的数据缓存下来(当然这些数据应该是固定的,如果每次点击要请求不同的数据要另当别论),等下次用时已经有数据了。

比如我的项目遇到一次操作要请求25000多条数据,而请求时间大约4-5秒,我就把这个操作提前到载入页面时,等下次操作时不必再请求数据,直接读取数据即可,这样效率就提上去了。(在这里原来用的是eval对请求到的json数据进行解析,发现效率不高,解析过程页面会卡顿1-2s,改为JSON.parse()后页面不再卡顿。那么现在可以说完全实现了异步请求数据,在页面毫无感觉的情况下已经将数据准备完毕)

3.关于缓存的思想我理解的就是我们把一些必须要经过的步骤提前了,等下次要用时即可省略该步骤,从而得到效率上的提升。

同时关于JS异步的机制我想可以利用它异步的特性,让它的callback queue队列不要空着,我们可以一直让它忙碌着做一些预处理,这样应该在效率提升上会有点帮助吧

4.再说说浏览器,浏览器主要包含JS引擎、GUI界面渲染渲染线程、事件触发线程和http请求线程。

对于JavaScript引擎,事件触发线程捕捉到的如点击事件会异步传到JS任务队列中,如果JS正在处理耗时的操作,那么这个鼠标点击事件就会等待执行,即用户看到的界面卡顿。

还是要利用好js的异步机制,多写写回调函数,在必要时一定用得上。

如下:

function closeDisplay(){

console.log("display none");

}

function mainProgram(callback){

console.log("执行中...")

console.log("执行完毕,执行回调函数");

callback();

}

mainProgram(closeDisplay);

以上仅个人理解,这里看到有几篇不错的关于JS单线程和异步的文章分享一下

https://www.cnblogs.com/woodyblog/p/6061671.html

https://www.cnblogs.com/hksac/p/6596105.html

http://blog.csdn.net/baidu_32262373/article/details/54969696


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值