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 相关文章推荐
jquery1.10给新增元素绑定事件的方法
Mar 06 Javascript
JavaSript中变量的作用域闭包的深入理解
May 12 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
深入了解JavaScript中的Symbol的使用方法
Jul 28 Javascript
jqTransform美化表单
Oct 10 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
Jan 28 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
详解Vue2中组件间通信的解决全方案
Jul 28 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
Sep 24 Javascript
比较node.js和Deno
Apr 27 Javascript
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获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
修复ie8&chrome下window的resize事件多次执行
2011/10/20 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
jquery自定义表格样式
2015/11/23 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python中关于浮点数的冷知识
2019/09/22 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
Python timeit模块的使用实践
2020/01/13 Python
泰国网上购物:Shopee泰国
2018/09/14 全球购物
2015年六一儿童节活动总结
2015/02/11 职场文书
土建技术员岗位职责
2015/04/11 职场文书
单身证明格式样本
2015/06/15 职场文书
table不让td文字溢出操作方法
2022/12/24 HTML / CSS