JavaScript中从setTimeout与setInterval到AJAX异步

 更新时间:2017年02月13日 14:35:30   作者:Binnear  
这篇文章主要介绍了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异步,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • javascript实现点击按钮让DIV层弹性移动的方法

    javascript实现点击按钮让DIV层弹性移动的方法

    这篇文章主要介绍了javascript实现点击按钮让DIV层弹性移动的方法,实例分析了javascript操作div层的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • webpack图片转为base64的实现示例

    webpack图片转为base64的实现示例

    在开发过程中,图片转成base64是常有的事,本文主要介绍了webpack图片转为base64的实现示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • js获取html页面节点方法(递归方式)

    js获取html页面节点方法(递归方式)

    这篇文章主要介绍了js使用递归方式获取html页面节点的方法,大家可以参考使用吧
    2013-12-12
  • Es6 Generator函数详细解析

    Es6 Generator函数详细解析

    Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。这篇文章给大家介绍Es6 Generator函数的相关知识,感兴趣的朋友一起看看吧
    2018-02-02
  • js如何改变文章的字体大小

    js如何改变文章的字体大小

    这篇文章主要介绍了js改变文章字体大小的方法,大家在使用word文档时工具栏为大家提供更改字体大小的选项,那js是如何改变文章字体大小,下文为大家揭晓,需要的朋友可以参考下
    2016-01-01
  • 浅谈JavaScript Math和Number对象

    浅谈JavaScript Math和Number对象

    这篇文章主要简单介绍了JavaScript Math和Number对象的相关资料,需要的朋友可以参考下
    2015-01-01
  • js下拉选择框与输入框联动实现添加选中值到输入框的方法

    js下拉选择框与输入框联动实现添加选中值到输入框的方法

    这篇文章主要介绍了js下拉选择框与输入框联动实现添加选中值到输入框的方法,涉及javascript中onchange事件及页面元素遍历的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • JavaScript实现字符雨效果

    JavaScript实现字符雨效果

    这篇文章主要为大家详细介绍了JavaScript实现字符雨效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • iframe 异步加载技术及性能分析

    iframe 异步加载技术及性能分析

    我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为他可以和主页面并行加载,不会阻塞主页面。
    2011-07-07
  • JavaScript采用递归算法计算阶乘实例

    JavaScript采用递归算法计算阶乘实例

    这篇文章主要介绍了JavaScript采用递归算法计算阶乘,简单分析了javascript递归算法的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论