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