再谈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如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
Apr 20 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
textarea 控制输入字符字节数(示例代码)
Dec 27 Javascript
超炫的jquery仿flash导航栏特效
Nov 11 Javascript
javascript作用域问题实例分析
Jul 13 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
Apr 14 Javascript
轻松掌握JavaScript单例模式
Aug 25 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
Jan 02 Javascript
详解小程序开发经验:多页面数据同步
May 18 Javascript
VSCode launch.json配置详细教程
Jun 18 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
vue组件实例解析
2017/01/10 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
使用python实现画AR模型时序图
2019/11/20 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
法人单位授权委托书范文
2014/10/06 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
校友回访母校寄语
2015/02/26 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技