再谈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 相关文章推荐
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
Dec 19 Javascript
javascipt:filter过滤介绍及使用
Sep 10 Javascript
JS+CSS实现简易的滑动门效果代码
Sep 24 Javascript
JavaScript仿flash遮罩动画效果
Jun 15 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
Dec 14 Javascript
express express-session的使用小结
Dec 12 Javascript
详解在Node.js中发起HTTP请求的5种方法
Jan 10 Javascript
微信小程序云开发之数据库操作
May 18 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 Javascript
html5调用摄像头截图功能
Jan 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
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
python调用shell的方法
2013/11/20 Python
Django中间件基础用法详解
2019/07/18 Python
python 装饰器重要在哪
2021/02/14 Python
Python实现简单的2048小游戏
2021/03/01 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
在职人员函授期间自我评价分享
2013/11/08 职场文书
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python