阅读本文之前需要已经掌握js中promise的基础,通过这篇文章你将对js异步编程的内部原理有具体的理解,并了解到js中async和await语法是对promise对象的进一步封装。

一、js异步编程工作原理

       js语言是单线程的,但js的运行环境却不是单线程的,当js运行在浏览器上的时候,浏览器还会维护GUI渲染线程、JS引擎线程、事件触发线程、定时触发器线程、异步http请求线程等,这就解释了为什么诸如定时器、网页请求等异步事件能发生。和C语言类似,js语言也有执行栈,执行栈中存储执行上下文,执行过程如下:

  1. 在执行栈中,上面执行环境的代码先执行,执行环境的代码执行完后,该执行环境从执行栈中弹出。
  2. 执行环境执行代码遇到异步代码块时,会通知JS宿主环境线程
  3. 当事件触发时,将一个事件消息推入消息队列。(队列是先进先出。注意:这时候不是立即执行,要等到执行栈的线程空闲时,Event Loop(事件循环)会从消息队列中取出一个消息执行,以此类推。)


    值得一提的是,所有的同步代码都是立即执行到完毕的(阻塞),也就是不会进入到消息队列中,只有异步代码才会被放入到消息队列中,等到执行栈中的任务完成后才会依次执行。

二、async, await语法糖

       async函数本质上就是将函数包装成了一个promise对象,其中return xxx语句就相当于promise中的resolve(xxx),而await语句则将then语句封装起来,let data=await p相当于p.then(data=>{})(其中p为promise对象)。

参考文献

1.https://blog.csdn.net/huangpin815/article/details/77650267

1

Last modification:February 14th, 2020 at 07:05 pm
如果觉得我的文章对你有用,请随意赞赏