再谈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 相关文章推荐
node.js中的fs.stat方法使用说明
Dec 16 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
一步步教大家编写酷炫的导航栏js+css实现
Mar 14 Javascript
实例讲解JavaScript中instanceof运算符的用法
Jun 08 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
Vue实现typeahead组件功能(非常靠谱)
Aug 26 Javascript
Angular实现下载安装包的功能代码分享
Sep 05 Javascript
JS Input里添加小图标的两种方法
Nov 11 Javascript
Vue2.5通过json文件读取数据的方法
Feb 27 Javascript
微信小程序访问豆瓣电影api的实现方法
Mar 31 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 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代码
2008/09/10 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
javascript中的几个运算符
2007/06/29 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
浅谈django的render函数的参数问题
2018/10/16 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
小学生演讲稿
2014/01/12 职场文书
教师年度考核评语
2014/04/28 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
借款民事起诉状范文
2015/05/19 职场文书
演讲开头怎么书写?
2019/08/06 职场文书