事件轮询机制和promise(怪异机制?)
事件轮询机制
任务队列分为
宏任务队列
微任务队列
当碰上异步代码时,会将异步代码传给web API 由web API 将异步代码放到任务队列中,script整体代码、setTimeout、setTnterval、I/O…放在宏任务队列中, promise.then()放在微任务队列中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTecKceA-1646959896185)(C:\Users\Rick.li\AppData\Local\Temp\1646924656823.png)]
对上述代码分析:
1.先将整体代码块放进调用栈,从上到下执行
setTimeout和.then后面的代码为异步代码段
将其按照顺序放进宏任务队列和微任务队列
这个阶段输出 1 3 5
2.调用栈每空一次,清空一次微任务队列
所以接下来是将微任务队列中的代码段依次放进调用栈
这个阶段得到结果是 1 3 5 4
3.微任务队列清空,访问宏任务队列,将宏任务队列中第一个代码段放进调用栈中执行
这个阶段得到的结果是 1 3 5 4 2
4.调用栈为空,再次访问微任务队列,微任务列表为空,转访问宏任务列表第一个代码段,宏任务列表也为空,则执行结束
进一步详解:
JavaScript
语言是单线程的,同一个时间只能做一件事;- 遵循事件循环机制,当JS解析执行时,会被引擎分为两类任务,同步任务(
synchronous
) 和异步任务(asynchronous
)。对于同步任务来说,会被推到执行栈按顺序去执行这些任务。对于异步任务来说,当其可以被执行时,会被放到一个任务队列(task queue
)里等待JS引擎去执行。当执行栈中的所有同步任务完成后,JS
引擎才会去任务队列里查看是否有任务存在,并将任务放到执行栈中去执行,执行完了又会去任务队列里查看是否有已经可以执行的任务。这种循环检查的机制,就叫做事件循环(Event Loop
)。对于任务队列,其实是有更细的分类。其被分为 微任务(microtask
)队列 & 宏任务(macrotask
)队列。
参考:https://blog.csdn.net/WuLex/article/details/106058625
关于promise的怪异机制
promise一般用于异步代码段
先看一段代码:
最开始我的结果是 1 11 2 21 23 12
按照正常的事件轮询机制,这就是从上到下,依次输出,因为.then后面的代码段必须得等到前面的代码段执行完才能执行,但是这段代码段把小编我给整迷糊了
真正的输出结果并非如此,而是这样的
为什么是这样呢?
发现没四次向前返一次
这段代码的另一个版本:
输出结果又让我诧异了:
竟然没有改变输出顺序
因为多了一个return
为什么????????
事件轮询机制和promise(怪异机制?)相关推荐
- 轮询机制php,JS事件轮询机制讲解
JS是单线程语言,深入理解JS里的Event Loop,本文主要和大家分享JS事件轮询机制,希望能帮助到大家. JS的执行机制(一): 1.首先判断JS是同步还是异步,同步就进入主进程,异步就进入ev ...
- JS事件轮询机制(Event Loop)
概念 事件轮询 (eventloop) 是"一个解决和处理外部事件时将它们转换为回调函数的调用的实体(entity)" JavaScript 语言的一大特点就是单线 ...
- Node中的事件轮询机制
文章目录 2 node中的事件循环模型 2-1 一些属性 2-2 循环模型 node事件循环总共有==六个阶段== process.nextTick()函数 __实例__ 2 node中的事件循环模型 ...
- event loop 事件轮询机制
1,event loop(事件轮询/事件循环) 首先我们要知道 由于js是单线程的脚本,异步事件要基于回调来实现的 而event loop 就是异步回调的实现原理 1,js的执行顺序 从前到后,一行一 ...
- nodejs的事件轮询机制
/* 面试题:nodejs的事件轮询机制*/setTimeout(function() {console.log('setTimeout()') }, 0)setImmediate(function( ...
- 事件轮询(Event Loop) 宏任务与微任务
事件轮询(Event Loop) 宏任务与微任务 文章目录 事件轮询(Event Loop) 宏任务与微任务 前言 Javascript诞生 Javascript如何执行 Event Loop是什么? ...
- 事件轮询 Event Loop
今天在看Node.js的时候接触到了轮询的概念,原来一直不知道,轮询一直存在于JavaScript中,每天都在接触它,然而并不知道,哈哈. 一.概念理解 事件轮询(Event Loop)是一个很重要的 ...
- Node.js的事件轮询Event Loop原理解释
事件轮询主要是针对事件队列进行轮询,事件生产者将事件排队放入队列中,队列另外一端有一个线程称为事件消费者会不断查询队列中是否有事件,如果有事件,就立即会执行,为了防止执行过程中有堵塞操作影响当前线程读 ...
- php异步轮询如何实现,深入剖析JavaScript异步之事件轮询
本篇文章给大家带来的内容是关于深入剖析JavsScript异步之事件轮询,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. JavsScript 是一门单线程的编程语言,这就意味着一个时 ...
最新文章
- Directx11教程(15) D3D11管线(4)
- spring框架文档学习(包会)
- 【神经网络与深度学习】CIFAR-10数据集介绍
- (DevExpress2011控件教程)ASPxGridView 范例3 :ASPxGridView 排序和分组、过滤行、统计功能等功能实现...
- JDBC:深入理解PreparedStatement和Statement
- 树莓派与阿里云服务器进行socket通信
- hdmi接口线_终于有人能把HDMI和VGA的5大区别讲全了,网友:讲得真详细
- 工程图字体宋体仿宋_宋黑仿变各种字体的审美禀赋
- xy坐标转换经纬度C语言,(转载)经纬度与西安80,北京54的坐标系转换(C# 实现)...
- 为什么一线互联网公司的校招高薪都是算法类,工程岗校招不配拥有高薪吗?
- 15个漂亮的企业网站设计案例欣赏
- Win7里如何找到管理员账号并切换到管理员账户登录?
- 关于VC++6.0显示“不能启动工具,操作成功完成”问题
- Android studio3.6.3的jdk版本设置在哪里?
- Mozilla的架构(收集)
- 集合竞价如何买入_集合竞价如何挂单:集合竞价该挂什么价格
- k8s教程(Volume篇)-PVC详解
- 美丽天天秒源码之会员分润代码分享
- 写给20岁左右的读者朋友
- gpt linux双系统安装win7系统分区格式化,在不格式化gpt分区的情况下重新安装win7系统的教程...
热门文章
- NYOJ - 478
- CC00019.bigdatajava——|JavaMySQL基础.V19|——|MySQL.v19|DML_删除数据|
- ad19生成gerber文件,AD10生成gerber文件的详细说明
- 产品方法论总结(4)——痛点、痒点、爽点
- 字节跳动笔试题03麻将游戏
- 锐捷——静态路由基础配置
- Vue.js----入门 (3)----v-bind、v-on、v-model等指令以及其语法糖的用法
- Spring核心技术(八)——Spring自动装载的注解
- 国际期货|外盘期货:恒生指数涨02%、恒生科技指数跌0.08%
- matlab画阴影图