再谈Javascript中的异步以及如何异步


Posted in Javascript onAugust 19, 2016

为什么需要异步?why?来看一段代码。

问题1:

for(var i=0;i<100000;i++){

}

alert('hello world!!!');

这段代码的意思是执行100...次后再执行alert,这样带来的问题是,严重堵塞了后面代码的执行,至于为什么,主要是因为JS是单线程的。

问题2:

我们通常要解决这样一个问题,如果我们需要在head里面加入script代码的话,一般会将代码写在window.onload里面(如果操作了dom的话),你有没有想过,为什么要加window.onload?原因就是你在操作dom的时候script后面的html代码浏览器还没有开始加载,结果人家还没有出生你就想着去娶她,这可能吗?当然不可能,加上window。onload之所以可以是因为,window.onload里面的代码是在文档全部加载完毕后执行的,也就相当于异步。

问题3:

有时候页面并不需要一次性把所有的代码都加载,更多的时候我们是按照某个需求才去加载某段代码的。 

什么是单线程?

你可以这样理解单线程就是代码一段一段的执行,先执行前面的,前面的执行完了再执行后面的。 

那JS中有哪些是异步的呢?

我相信这个东西,几乎都用烂了,它就是setTimeout/setInterval当然还有Ajax,Ajax异步我相信大家都知道,当然也可以同步但没人那么去做,但是对于setTimeout和setInterval是异步可能有些小伙伴不同了解,下面说说为什么说setTimeout是异步的。

setTimeout(function(){
console.log(0);
},0)

console.log(1);

// 1

// 0

运行这段代码后先打印的是1,而不是0,有些小伙伴是不是开始迷惑了,这里我们虽然给setTimeout设置的是0秒后执行console.log(0)  ,但是这个setTimeout很特别,因为它是异步的,我们先抛开这里为什么打印的是1然后才是0,先来聊聊什么是异步。 

什么是异步?

比方说有些饭店你去吃饭需要提前预定,等其他人吃完你才能去,因此在其他人吃饭的时候你可以去干其他的事情,等其他人吃完了会有人来通知你,于是你可以去了,那么对于代码来说,如ajax,你定义了一个回调方法,这个回调方法并不会当时就去执行,而是等待服务器响应完成之后才会去执行这段代码。 

我们回到前面那段setTimeout身上,它的工作原理是这样的,当你定义setTimeout那一刻起(不管时间是不是0),js并不会直接去执行这段代码,而是把它扔到一个事件队列里面,当页面中所有同步任务都干完了以后,才会去执行事件队列里面的代码。什么是同步,除了异步代码就是同步—_—。 

JS怎么实现异步?

1.利用setTimout实现异步

setTimeout(function(){
console.log(document.getElementByTagName('body')[0]);
},0)

但是setTimeout有些小小的问题,就是时间不精确,如果你想更快的执行这段代码我们可以使用html5提供的一个函数。

requestAnimationFrame(function(){
console.log(document.getElementByTagName('body')[0]);
})

requestAnimationFrame和setTimeout的区别就在于requestAnimationFrame比setTimeout更快执行,因此很多人用requestAnimationFrame来制作动画。

2.动态创建script标签

var head = document.getElementByTagName('head')[0];
var script = document.createElement('script');
script.src = '追梦子.js';
head.appendChild('script');

   3.利用script提供的defer/async

<script src="xx.js" defer></script>

defer:当页面加载完毕以后才去执行这段代码。

<script src="xx.js" async></script>

async:异步执行script代码

不过异步也是缺点的,比如下面这段代码:

  正常代码: 

 

try{
throw new Error('hello world');
}catch(err){

console.log(err);
}

// Error: hello world(…)

  异步代码:  

try{
setTimout(function(){


throw new Error('hello world');

},0)
}catch(err){

console.log(err);
}

// ReferenceError: setTimout is not defined(…)

可以发现catch里面的代码并没有执行,也就是说try无法捕获异步里面的代码。

总结

关于JS中的异步以及如何异步到这就基本结束,关于JS的异步算是老生常谈了,但是还是希望本文的内容对大家能有一些帮助。

Javascript 相关文章推荐
枚举JavaScript对象的函数
Dec 22 Javascript
日期处理的js库(迷你版)--自建js库总结
Nov 21 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
浅谈Javascript变量作用域问题
Dec 16 Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 Javascript
ReactJs快速入门教程(精华版)
Nov 28 Javascript
js鼠标经过tab选项卡时实现切换延迟
Mar 24 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
Apr 20 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
JS实现网页时钟特效
Mar 25 Javascript
用原生js统计文本行数的简单示例
Aug 19 #Javascript
jQuery购物网页经典制作案例
Aug 19 #Javascript
手机Web APP如何实现分享多平台功能
Aug 19 #Javascript
浅谈Javascript中的12种DOM节点类型
Aug 19 #Javascript
js实现select选择框效果及美化
Aug 19 #Javascript
JavaScript面向对象编写购物车功能
Aug 19 #Javascript
javascript设计模式之module(模块)模式
Aug 19 #Javascript
You might like
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
原生js写的放大镜效果
2012/08/22 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
javascript中new关键字详解
2015/12/14 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
使用python实现生成用户信息
2017/03/20 Python
python实现二分查找算法
2017/09/21 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Django 拆分model和view的实现方法
2019/08/16 Python
python中yield的用法详解
2021/01/13 Python
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
自我鉴定范文300字
2013/10/01 职场文书
求职简历的自我评价怎样写好
2013/10/07 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
群众路线个人整改措施
2014/10/24 职场文书
放射科岗位职责
2015/02/14 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
党员证明模板
2015/06/19 职场文书
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers