JavaScript运行机制
在说异步执行之前,先要了解一下JavaScript的运行机制。JavaScript是单线程执行的,也就是说在同一个时间点只能有一个任务在执行,表示:单线程执行的程序都要进行排队,一个任务结束之后另一个任务才能执行。但当前一个程序执行耗时较长时,浏览器无响应,会导致后面的其他程序无法执行。为了解决这个问题,JavaScript语言将计算机程序执行分两种:同步执行和异步执行.
同步执行
同步执行就是正常的计算机程序执行的3大顺序流程。分别是:
- 顺序控制语句:从上至下、从左至右执行
- 分支控制语句:if语句和switch语句
- 循环控制语句:for循环、while循环、do...while循环、for...in循环、forEach循环
异步执行
如果在函数返回的时候,调用者还不能够得到预期的结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。所谓的异步执行就是一种特殊的程序执行方式。 主要有三类,分别是:
- 定时器setInterval、延时器setTimeout
- 事件的绑定 onclick.
- ajax请求
异步执行的原理
- 所有的异步程序的执行都会在同步程序执行结束之后再来执行。
- 异步程序的执行顺序先看时间的长短,如果时间相同,就看代码的先后顺序;如果时间不同,时间短的先执行。
异步程序执行过程
- 正常是从一行代码开始执行程序,同步程序正常执行
- 如果发现是异步程序,就暂时不执行,先存储在异步池中等待执行
- 将程序中所有的同步程序执行完毕后,再开启异步池,执行异步程序
- 执行异步程序时,当设定的时间到达,就会执行对应的异步程序。先到设定时间的异步程序,先执行;如果设定的时间相同,按照异步程序的顺序来执行
代码
如下是代码段的语法:
setInterval(function () {
console.log('异步执行的程序,定时器1:时间为5000毫秒');
}, 5000);
setInterval(function () {
console.log('异步执行的程序,定时器2:时间为1000毫秒,代码在前');
}, 1000);
console.log('同步执行的程序')
输出结果
说明
- 直接输出的程序是同步执行,会在异步执行程序之前执行,也就是说:所有的异步程序的执行都会在同步程序执行结束之后再来执行。
- 定时器是异步执行程序,代码中第二个定时器时间为1000毫秒,比第一个定时器时间短,所以先执行。也就是说:在第一个定时器执行完4次后,第二个定时器才会执行。