await原理 js_深入浅出node.js异步编程 及async await原理

最近看了一些文章对于async await的原理及概念的解析,我觉得很多时候有些不太准确。

尤其是对于async和await会阻塞线程的说法更是有些扯淡了,JS本身就是单线程的语言如果await会阻塞线程那不是说JS自己搬石头砸自己的脚?

用最简单的话去描述

在node中执行一个文件,或处理一个HTTP请求,这个时候js会将同步任务与异步任务区分,如果是同步任务将会被推入执行栈交由主线程执行。

如果是异步任务将被扔到事件表当中,当异步任务执行完毕将会被推入事件队列当中,等主线程将同步任务执行完毕后。

将会执行事件队列中的异步任务,其中又分为宏任务与微任务。

当事件队列中没有执行完毕的异步任务,主线程将会处理下一个http请求,再次进入这样的循环,处理同步任务,查看事件队列中是否有执行完毕的异步任务。

如果在执行时遇到async await

那么会将awiat后的代码丢入事件表,并对当前函数进行压栈

也就是跳过当前函数执行下面主线程中的代码 当主线程同步任务执行完毕后,会按照node原本的机制执行事件队列中的异步任务

这个时候如果awiat后的表达式或异步任务已经执行完毕,那么会将其所在的函数进行出栈,执行。

那么问题来了,这其中有所谓的阻塞I/O吗?没有,那么为什么要说这些误导大家呢?要知道node是非阻塞I/O模型,如果I/O阻塞那node还要不要玩了?

下面这张图是event loop循环的过程。

481e2f0bae884fc64fcd849d61cad7b7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值