js定时器异步请求时候 上一个请求没有响应时下一个请求已经开始_关于异步的理解...
这里只是个人的理解,用于理解+笔记,记录对异步的粗糙理解。
--写在前面
异步的情景:
一:异步的出现场景可分为以下
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.htmlwww.ruanyifeng.com
重新修改: 关于对事件循环和任务队列的理解
详解事件循环与任务队列www.jianshu.com
js定时器异步请求时候 上一个请求没有响应时下一个请求已经开始_关于异步的理解...相关推荐
- nginx post请求超时_nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)
nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来 ...
- 请求失败或服务器为及时响应,SQLServer(MSSQLSERVER)请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。...
问题描述: 有时候网站访问不起,打开详细错误描述,出现如下图错误. 看到错误提示,便知道是连接数据库失败导致.到数据库服务器检查,发现mssqlserver服务停止了,手动启动服务,又出现服务无法响应 ...
- Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器
重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...
- js异步请求php数据,原生JS发送异步数据请求实例详解
这篇文章主要为大家详细介绍了原生JS发送异步数据请求的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在做项目的时候,有时候需要用到异步数据请求,但是如果这个时候没有框架的依赖,就需要用到 ...
- ASIHTTP 框架,同步、 异步请求、 上传 、 下载
ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...
- JS对异步循环使用递归,分批进行大量异步请求
在上次使用了使用将同步请求改成异步请求的方法解决了 大量Ajax同步请求,出现浏览器页面假死,而Loading图标卡死的情况 之后 (详情见如下链接) CSDNhttps://mp.csdn.net/ ...
- JS定时器每几秒请求一次,且第一次请求无延迟
页面载入后,实现每隔几秒请求一次,直到返回想要的结果.且第一次请求无定时延迟. 常用的定时方法: setTimeout(()=> { //TODO... },2000) 延时2秒执行,且只 ...
- 一个“扛住100亿次请求”的春晚红包系统
文章来源:https://sourl.cn/wRp68e 前 言 偶然看到了<扛住100亿次请求--如何做一个"有把握"的春晚红包系统>一文,看完以后,感慨良多,收益很 ...
- chrome 请求带上cookie_【编号0002】请求头的内容,及其相关知识铺垫
更新时间,来一篇关于请求头的内容介绍 首先,什么是请求头?这里指的是HTTP 1 版本中的请求信息的头部内容,注意,不含主体 0. 背景说明 客户端:你的浏览器 服务器:指的是网站服务器 请求:客户端 ...
最新文章
- python学习手册条件-Python学习手册(第4版)pdf
- 常用的PL/SQL开发原则 by dbsanke
- 蓝牙协议 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP
- 64位系统上安装apache
- VTK:标记关键点用法实战
- 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)
- 从键盘上录入两个整数,计算a的b次方的结果
- linux下dvwa安装教程,在Kali Linux上部署DVWA
- Mac系统下运行Java项目出现Unable to start embedded Tomcat server解决方法
- pymysql执行有参数的in语句
- Tuxedo服务中间件
- 【操作系统】_7种进程调度算法
- rtl8169网卡驱动linux,Realtek RTL8110/RTL8169网卡驱动7.005 For Win7
- filebeat收集K8S日志,写入自动创建的索引
- 像素和厘米怎么换算_像素 amp;amp; 分辨率的那段剪不断理还乱的关系
- 微信小程序中组件传值
- PIC单片机-Mplab的使用与实践
- 遇见,那一份最美的眷恋
- python实现免费同声传译 (离线语音识别+免费翻译接口+系统声音录制)
- 真人拳皇项目第二次Scrum总结——史经浩
热门文章
- udp发包工具_利用nginx的第四层协议stream模块实现UDP端口的负载均衡
- jquery复选框组清空选中的值_jQuery选取所有复选框被选中的值并用Ajax异步提交数据...
- 新商标表明华为鸿蒙系统在海外或叫做“Harmony OS”
- 突发!美国国会发函要求 Facebook 立即停止 Libra 项目
- odoo10参考系列--ORM API 三(字段、继承与扩展、域和更新到新API)
- binarytreenode”使用 类 模板 需要 模板 参数列表_0基础掌握Django框架(7)Django模板介绍...
- springboot事物注解不生效_springboot事务不生效的几种解决方案
- ubuntu安装ros_ROS--Melodic 安装
- 循环计数_FOR 循环
- linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决