全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript中从setTimeout与setInterval到AJAX异步

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异步,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # settimeout与setinterval  # ajax  # 实例详解JavaScript中setTimeout函数的执行顺序  # JS ES6中setTimeout函数的执行上下文示例  # JS中SetTimeout和SetInterval使用初探  # js中setTimeout的妙用--防止循环超时  # JS中setTimeout和setInterval的最大延时值详解  # JavaScript计时器用法分析【setTimeout和clearTimeout】  # 详解JS中定时器setInterval和setTImeout的this指向问题  # JavaScript setTimeout与setTimeinterval使用案例详解  # 回调  # 会有  # 还可以  # 遍历  # 中有  # 什么呢  # 小编  # 就会  # 是在  # 在这里  # 是有  # 第一个  # 在此  # 也要  # 才会  # 还会  # 你在  # 还不  # 两种  # 而在 


相关文章: 如何快速选择适合个人网站的云服务器配置?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  php json中文编码为null的解决办法  如何通过建站之星自助学习解决操作问题?  建站之星安装需要哪些步骤及注意事项?  如何通过可视化优化提升建站效果?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  南京网站制作费用,南京远驱官方网站?  如何选择高效稳定的ISP建站解决方案?  如何在云主机快速搭建网站站点?  c++ stringstream用法详解_c++字符串与数字转换利器  自助网站制作软件,个人如何自助建网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何快速查询网址的建站时间与历史轨迹?  定制建站策划方案_专业建站与网站建设方案一站式指南  网站制作报价单模板图片,小松挖机官方网站报价?  宝塔面板创建网站无法访问?如何快速排查修复?  网站制作说明怎么写,简述网页设计的流程并说明原因?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  招贴海报怎么做,什么是海报招贴?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  济南网站制作的价格,历城一职专官方网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  定制建站如何定义?其核心优势是什么?  网站制作企业,网站的banner和导航栏是指什么?  定制建站流程步骤详解:一站式方案设计与开发指南  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  高防服务器租用如何选择配置与防御等级?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  建站之星如何保障用户数据免受黑客入侵?  如何获取开源自助建站系统免费下载链接?  如何配置支付宝与微信支付功能?  在线制作视频网站免费,都有哪些好的动漫网站?  大型企业网站制作流程,做网站需要注册公司吗?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  个人网站制作流程图片大全,个人网站如何注销?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何通过VPS建站无需域名直接访问?  网站制作公司,橙子建站是合法的吗?  如何高效完成独享虚拟主机建站?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  ,南京靠谱的征婚网站?  如何在景安服务器上快速搭建个人网站?  如何快速登录WAP自助建站平台?  网站网页制作专业公司,怎样制作自己的网页? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。