深入理解js中的异步原理

114 阅读1分钟

浏览器中的异步线程

仔细想想,在es6之前,我们虽然也可以构建异步任务,但是依赖于浏览器开启的异步线程,js引擎本身所做的只不过是在需要的时候,在给定的任意时刻执行程序中的单个代码块 (函数),多个代码块按顺序执行就是事件循环,js只是被动的去执行,其异步顺序是无法掌控的。

初步的异步原理event-loop

这里在讲一下这张图

setTimeout并没有把你的回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,环境(浏览器)会把你的回调函数放在事件循环中,这样,在未来某个时刻的 tick会摘下并执行这个回调。

为什么微任务总是先于宏任务

es6中的promise就是微任务,微任务其实就是js自己的异步处理,会把耗时的代码块,放到当前事件循环的末尾,每次遇到异步任务,都会往后排队,当然也可以准确的控制这个异步顺序,但是环境的任务队列是在下次tick 事件循环才开始执行的,所以当前的事件循环肯定先于下一次的事件循环。