JavaScript中从setTimeout与setInterval到AJAX异步


Posted in Javascript onFebruary 13, 2017

setTimeout与setInterval执行

首先我们看一下以下代码打印结果

console.log(1);
setTimeout(function() { console.log(2); },100)
setTimeout(function() { console.log(3); },50)
console.log(4);

打印结果是 1、4、3、2,你可能觉得理所应当,那我们再看下下面这个例子

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

这次的结果又会是什么呢?

1、3、2,不是1、2、3。到这里你可能会有疑惑了,明明定时器设置的时间为0,而且浏览器解析js是按照从上到下执行的,应该是1、2、3才对啊?

到这里我们要提一下浏览器的线程问题。

与js相关的浏览器线程有三个(注意:js解析是单线程) - js代码执行线程( 主线程 ) - UI渲染线程 - 事件循环线程

其中js代码执行线程与UI渲染线程两者是互斥的,也就是说js代码执行线程运行的时候,UI渲染线程会停止工作,这样做也是为了防止js中的DOM操作会导致两线程冲突;而事件循环线程比较特殊,接下来会根据setTimerout的执行过程进行讲解其作用。

回到上面的第一道题目

console.log(1);
 setTimeout(function() { console.log(2); },100)
 setTimeout(function() { console.log(3); },50)
 console.log(4);

 执行过程:

js主线程运行,遇到console.log(1),直接运行,在控制台输出结果;

主线程继续运行,然后遇到第一个setTimeout,接着setTimeout中的回调函数会被放入到一个事件队列中(这里的事件队里可以想象成一个备忘录,里面记录的全是一些需要做而未做的事);

遇到第二个setTimeout,其中的回调函数依然被加入到事件队列中;

执行console.log(4),到这里主线程的任务全部执行完毕,除了setTimeout里面的回调函数;

这个时候,我们还未说明的事件循环线程开始工作,它会去循环遍历事件队列(也就是我们的备忘录),如果事件队列中有回调函数,它就会将事件队列中的回调函数重新交给主线程;

主线程收到回调函数,然后开始执行函数体。(这里要注意,因为两个setTimeout本身有执行时间,所以在这里的时候就会根据时间的长短按顺序执行啦。)

  setInterval原理与之相同,不作另说。

总的来说,setTimeout与setInterval的执行会等到主线程的所有任务全部执行后,才会再执行其中的回调函数,所以在使用它们的时候也要注意,特别是在主线程中有特别耗时的任务的时候,两种定时器会被不可预测的延后。

讲到这里,大家有没有想到什么呢?

恩,就是异步,setTimeout的执行有没有一点异步的感觉呢?但又因为它必须是等到主线程全部执行完才会执行,所以可以称之为伪异步。

说到异步,我们还会想到AJAX,都说AJAX是异步,但是它异步的原理想必还不清楚的你应该有点兴趣了解的。

异步:简单说就是在处理某一件事的时候还可以去做别的事,比如:你在银行取号后等待取钱,在等待的过程中你还可以玩手机,和别人聊天等等,这个过程就是异步的。

AJAX 异步的原理

发送一个AJAX请求的时候,浏览器会有一个专门的线程来进行该任务;

而在AJAX中也是有回调函数的,比如请求成功后的回调,失败后的回调,这些回调函数与setTimeout中的回调一样会被推入到事件队列中;

浏览器接会再次提供一个县城接收AJAX请求返回的数据;

事件循环线程这时候知道事件队列中AJAX的回调函数能够被执行了,遍历事件队列,将其中的回调函数交回给js主线程;

主线程执行AJAX回调函数内部代码。

总的说来,AJAX的请求不会干扰到主线程任务的执行,它有自己专供的线程来处理其任务,就像是浏览器的亲儿子~~~

以上所述是小编给大家介绍的JavaScript中从setTimeout与setInterval到AJAX异步,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js中设置元素class的三种方法小结
Aug 28 Javascript
js遍历td tr等html元素
Dec 13 Javascript
jquery 按钮状态效果 正常、移上、按下
Aug 12 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 Javascript
使用AngularJS实现可伸缩的页面切换的方法
Jun 19 Javascript
ES6新特性八:async函数用法实例详解
Apr 21 Javascript
微信小程序使用navigateTo数据传递的实例
Sep 26 Javascript
jqueryUI tab标签页代码分享
Oct 09 jQuery
angular中子控制器向父控制器传值的实例
Oct 08 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
Bootstrap选项卡学习笔记分享
Feb 13 #Javascript
jQuery Ajax全解析
Feb 13 #Javascript
jQuery中 bind的用法简单介绍
Feb 13 #Javascript
jquery实现轮播图效果
Feb 13 #Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
Feb 13 #Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 #Javascript
简单实现js倒计时功能
Feb 13 #Javascript
You might like
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
javascript 函数调用规则
2009/08/26 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
python并发2之使用asyncio处理并发
2017/12/21 Python
详解python之heapq模块及排序操作
2019/04/04 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
社会公德演讲稿
2014/05/20 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
2016年教代会开幕词
2016/03/04 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
python周期任务调度工具Schedule使用详解
2021/11/23 Python