再谈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 相关文章推荐
禁止你的左键复制实用技巧
Jan 04 Javascript
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
Jun 04 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
javascript中去除数组重复元素的实现方法【实例】
Apr 12 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
原生JS:Date对象全面解析
Sep 06 Javascript
详谈js中标准for循环与foreach(for in)的区别
Nov 02 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
Oct 07 Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 Javascript
vue页面跳转实现页面缓存操作
Jul 22 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设计模式 Factory(工厂模式)
2011/06/26 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php获取excel文件数据
2017/04/21 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
jQuery 操作option的实现代码
2011/03/03 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
python 实现归并排序算法
2012/06/05 Python
Python用GET方法上传文件
2015/03/10 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Python中装饰器学习总结
2018/02/10 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
岗位职责的构建方法
2014/02/01 职场文书
综合实践活动方案
2014/02/14 职场文书
家长会主持词开场白
2014/03/18 职场文书
国际金融专业自荐信
2014/07/05 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
兵马俑的导游词
2015/02/02 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
结婚典礼致辞
2015/07/28 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫