浅析JS中异步调用机制

JS是单线程的,单线程是指在事件队列中,每次只执行一个事件,如果设计成多线程模式,DOM之间会存在资源竞争。

首先,我们要了解浏览器内核的线程,由多个线程组成浏览器的渲染进程,共同渲染出页面。

浅析JS中异步调用机制

各线程作用如下:

  • GUI(图形用户界面)渲染线程

        渲染界面:解析HTMl,CSS,构建DOM树,Render树,布局和绘制。重绘或有回流时执行。  

  • JS引擎线程

        处理JS的脚本,处理任务队列里的任务。

  • 事件触发线程

       控制时间循环,当JS引擎线程处理如setTimeout,或浏览器内核的其他线程,如鼠标点击、AJAX异步请求时,将对应任务添加到事件线程中。当事件被触发将其添加到待处理队列列尾,当JS引擎空闲时处理。

  • 定时触发器线程

         setInterval与setTimeout所在线程,当计时完成被触发,事件被添加到事件队列等待JS执行。W3C的HTML规定,setTimeout低于4ms的时间间隔算为4ms。

  • 异步HTTP请求线程

       在XMLHttpRequest连接后新启动的一个线程,如果检测到请求的状态变更,且设有回调函数,将其添加到事件队列,等待JS处理。

 

JS如何在单线程实现异步调用

     JS执行异步任务,以setTimeout为例,具体是浏览器的定时触发线程执行而不是JS线程执行,其执行结果将返回到任务队列中,其实就是返回回调函数,当JS的执行完主任务里的任务时,将执行任务队列的任务。执行异步任务,同时也就是执行回调函数,如此循环(event loop)。

浅析JS中异步调用机制

 基础的异步有setTimeout和setInterval函数,常见异步事件比如:鼠标点击、键盘回车、网络请求等这些与浏览器紧密联系的操作,比如一些延迟交互特效等等,还有就是ajax。

最后附上参考文章:

       浅谈浏览器多进程与JS线程

       前端中的事件队列

       JavaScript 运行机制详解:再谈Event Loop