这里只是个人的理解,用于理解+笔记,记录对异步的粗糙理解。

--写在前面

异步的情景:

一:异步的出现场景可分为以下

1. Ajax请求数据时

2. 定时器

3. 一些点击事件(这里暂时了解的不是特清楚)

二:注意点

1. 为什么会需要异步?

2. 异步的原理是怎么样的?

3. 当多个异步同时出现,他的执行顺序是怎么样的?


为什么会需要异步?

由于 js是单线程的语言 ,这样对于也就注定了他不能像其他语言一样 同一时间内同时 执行多个任务,所谓“单线程”就是一根筋,对于拿到的程序,一行一行的执行,直到执行为完成,中间如果有 卡顿,延迟都会一直等待,别的事都不做。

var i, t = Date.now()
for (i = 0; i < 100000000; i++) {}
console.log(Date.now() - t)  // 250 (chrome浏览器)

上面这种执行时没问题的,但是js用在游览器客户端,可能会有大量的网络请求,而一个网络资源啥时候返回,这个时间是不可预估的,

对于这种场景 js就设计了异步 => 即 发送一个请求,就先不管了,先干其他事情,请求啥时候返回结果,到时候再说,这样就能保证一个网页的流程运行。(JavaScript 内部采用的“事件循环”机制)


异步的原理是怎么样的?

var ajax = $.ajax({url: '/data/data1.json',success: function () {console.log('success')}
})

Ajax中传入2个参数,这里介绍第二个参数,success是一个函数,这个函数传过去,并不会立即执行,而是等着请求成功之后才能执行,这里称之为 回调函数

简单介绍些 回调函数:

回调什么时候执行?

同步里的回调: 一般在同步情境下是最后执行的。

异步里的回调: 而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。

如果执行那么会 当有结果返回 再进行执行

  • 简单理解所谓“回调函数”就是那些被主线程挂起来的代码,(异步必须指定回调,同步的不是挂起)

使用场景:如果动态的加载js文件 Ajax请求等都可能会用到

回调就暂时说道这里。。。

So. 可以看出异步的核心在于:就是将callback作为参数传递给异步执行函数,当有结果返回之后再触发 callback执行

好了我们现在继续来说异步:

之前说过js是单线程,意味着需要排队执行,这样如果计算量特大,cpu可能忙不过来,JavaScript语言的设计者意识到,主线程完全可以不管 IO(阻塞),挂起处于处于等待中的任务,先运行排在后面的任务,等到这个 IO(阻塞)返回了结果,再回过头来,把挂起的任务继续执行下去。(说明js不存在同时进行的任务,单线程原理(webWork除外))

于是任务可以分为两种,一种是同步任务,另一种是异步任务。

  • 同步任务指的是,在主线程上执行的任务,只有前一个任务执行完,才能执行后一个任务;
  • 异步任务指的是,不进入主线程,而进入“任务队列”的任务,只有“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行;

具体来说,异步执行的运行机制:

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。

注意:

  • "任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本是自动的,只要主线程 执行栈一清空,“任务队列”上第一位的任务就自动进入主线程,但是这里要说说定时器,主线程首先要检查一下执行时间,因为定时器中二个参数并不是真正等待开始执行时间,在这个时间之前可能存在大量的IO导致定时器中回调 不能正常的进入主线程执行

当多个异步同时出现,他的执行顺序是怎么样的?

个人理解还是同 异步自己返回结果的时间做比较,因为这个时间本省就是不可预估的;
扩充:异步的js 中存在 点击事件,网络请求, 定时器这几种,
点击事件,我们暂时不讨论,因为其本身就很快(几百毫秒,不考虑多个鼠标同时点击。这也只是线程抢占的快慢问题)
网络请求,和定时器是一个道理,网络请求调用的是同步代码,但是异步的逻辑在于请求有返回结果;请求的时长决定了回调函数何时进入事件队列中去,和定时器第二个参数类似;

As:

(function(){setTimeout(fuction(){console.log("aa")},3000);setTimeout(fuction(){console.log("bb")},1000);// bb aa
})();// 严格来说 setTimeout(...0) 并不直接把项目插入到事件循环队列。定时器会在有机会的时候插入事件。像这种两个连续的 setTimeout(...0) 调用不能// 保证会严格按照调用顺序处理,所以各种情况都有可能出现,比如定时器漂移(function(){$.ajax(function(){console.log("aa")});setTimeout(fuction(){console.log("bb")},1000);// 这里的就要要看具体的 Ajax返回时间了,   //如果希望定时器,在请求之后执行,可以将其写在成功后的回调里面。
})();

在写之前也是参考了一些文章,阮一峰写的确实挺好了大家可以参考下:

http://www.ruanyifeng.com/blog/2014/10/event-loop.html​www.ruanyifeng.com

重新修改: 关于对事件循环和任务队列的理解

详解事件循环与任务队列​www.jianshu.com

js定时器异步请求时候 上一个请求没有响应时下一个请求已经开始_关于异步的理解...相关推荐

  1. nginx post请求超时_nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)

    nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来 ...

  2. 请求失败或服务器为及时响应,SQLServer(MSSQLSERVER)请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。...

    问题描述: 有时候网站访问不起,打开详细错误描述,出现如下图错误. 看到错误提示,便知道是连接数据库失败导致.到数据库服务器检查,发现mssqlserver服务停止了,手动启动服务,又出现服务无法响应 ...

  3. Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器

    重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...

  4. js异步请求php数据,原生JS发送异步数据请求实例详解

    这篇文章主要为大家详细介绍了原生JS发送异步数据请求的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在做项目的时候,有时候需要用到异步数据请求,但是如果这个时候没有框架的依赖,就需要用到 ...

  5. ASIHTTP 框架,同步、 异步请求、 上传 、 下载

    ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...

  6. JS对异步循环使用递归,分批进行大量异步请求

    在上次使用了使用将同步请求改成异步请求的方法解决了 大量Ajax同步请求,出现浏览器页面假死,而Loading图标卡死的情况 之后 (详情见如下链接) CSDNhttps://mp.csdn.net/ ...

  7. JS定时器每几秒请求一次,且第一次请求无延迟

    页面载入后,实现每隔几秒请求一次,直到返回想要的结果.且第一次请求无定时延迟. 常用的定时方法: setTimeout(()=> {  //TODO...   },2000) 延时2秒执行,且只 ...

  8. 一个“扛住100亿次请求”的春晚红包系统

    文章来源:https://sourl.cn/wRp68e 前 言 偶然看到了<扛住100亿次请求--如何做一个"有把握"的春晚红包系统>一文,看完以后,感慨良多,收益很 ...

  9. chrome 请求带上cookie_【编号0002】请求头的内容,及其相关知识铺垫

    更新时间,来一篇关于请求头的内容介绍 首先,什么是请求头?这里指的是HTTP 1 版本中的请求信息的头部内容,注意,不含主体 0. 背景说明 客户端:你的浏览器 服务器:指的是网站服务器 请求:客户端 ...

最新文章

  1. python学习手册条件-Python学习手册(第4版)pdf
  2. 常用的PL/SQL开发原则 by dbsanke
  3. 蓝牙协议 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP
  4. 64位系统上安装apache
  5. VTK:标记关键点用法实战
  6. 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)
  7. 从键盘上录入两个整数,计算a的b次方的结果
  8. linux下dvwa安装教程,在Kali Linux上部署DVWA
  9. Mac系统下运行Java项目出现Unable to start embedded Tomcat server解决方法
  10. pymysql执行有参数的in语句
  11. Tuxedo服务中间件
  12. 【操作系统】_7种进程调度算法
  13. rtl8169网卡驱动linux,Realtek RTL8110/RTL8169网卡驱动7.005 For Win7
  14. filebeat收集K8S日志,写入自动创建的索引
  15. 像素和厘米怎么换算_像素 amp;amp; 分辨率的那段剪不断理还乱的关系
  16. 微信小程序中组件传值
  17. PIC单片机-Mplab的使用与实践
  18. 遇见,那一份最美的眷恋
  19. python实现免费同声传译 (离线语音识别+免费翻译接口+系统声音录制)
  20. 真人拳皇项目第二次Scrum总结——史经浩

热门文章

  1. udp发包工具_利用nginx的第四层协议stream模块实现UDP端口的负载均衡
  2. jquery复选框组清空选中的值_jQuery选取所有复选框被选中的值并用Ajax异步提交数据...
  3. 新商标表明华为鸿蒙系统在海外或叫做“Harmony OS”
  4. 突发!美国国会发函要求 Facebook 立即停止 Libra 项目
  5. odoo10参考系列--ORM API 三(字段、继承与扩展、域和更新到新API)
  6. binarytreenode”使用 类 模板 需要 模板 参数列表_0基础掌握Django框架(7)Django模板介绍...
  7. springboot事物注解不生效_springboot事务不生效的几种解决方案
  8. ubuntu安装ros_ROS--Melodic 安装
  9. 循环计数_FOR 循环
  10. linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决