面试题

  • 请写出下面代码执行的结果

    console.log(1);
    setTimeout(() => {console.log(2);process.nextTick(() => {console.log(3);});new Promise((resolve) => {console.log(4);resolve();}).then(() => {console.log(5);});
    });
    new Promise((resolve) => {console.log(7);resolve();
    }).then(() => {console.log(8);
    });
    process.nextTick(() => {console.log(6);
    });
    setTimeout(() => {console.log(9);process.nextTick(() => {console.log(10);});new Promise((resolve) => {console.log(11);resolve();}).then(() => {console.log(12);});
    });
    

题解

答案

node -v < 11

1 7 6 8 2 4 9 11 3 10 5 12

node -v >= 11

1 7 6 8 2 4 3 5 9 11 10 12

解析

  • 宏任务 和 微任务

    • 宏任务:macrotask,包括 setTimeout、setInterval、setImmediate(node 独有)、requestAnimationFrame(浏览器独有)、I/O、UI rendering(浏览器独有)
    • 微任务:microtask,包括 process.nextTick(node 独有)、Promise.then()、Object.observe、MutationObserver
  • Promise 构造函数中的代码是同步执行的,new Promise() 构造函数中的代码是同步代码,并不是微任务
  • Node.js 中的 EventLoop 执行宏队列的回调任务有 6个阶段
    • 1,timers 阶段:这个阶段执行 setTimeout 和 setInterval 预定的 callback
    • 2,I/O callback 阶段:执行 除了 close 事件的 callbacks、被 timers 设定的 callbacks、setImmediate() 设定的 callbacks 这些 之外的 callbacks
    • 3,idle,prepare 阶段:仅 node 内部使用
    • 4,poll 阶段:获取新的 I/O 事件,适当的条件下 node 将阻塞在这里
    • 5,check 阶段:执行 setImmediate() 设定的 callbacks
    • 6,close callbacks 阶段:执行 socket.on(‘close’, …) 这些 callbacks
  • Node.js 中,宏队列主要有 4个
    • 1,Timers Queue
    • 2,IO Callbacks Queue
    • 3,Check Queue
    • 4,Close Callbacks Queue
    • 这四个都属于宏队列,但是在浏览器中,可以认为只有一个宏队列,所有的 macrotask 都会被加到这一个宏队列中,但是在 Node.js 中,不同的 macrotask 会被放置在不同的宏队列中。
  • Node.js 中,微队列主要有 2个
    • 1,Next Tick Queue:是放置 process.nextTick(callback) 的回调任务的
    • 2,Other Micro Queue:放置其他 microtask,比如 Promise 等
    • 在浏览器中,也可以认为只有一个微队列,所有的 microtask 都会被加到这一个微队列中,但是在 Node.js 中,不同的 microtask 会被放置在不同的微队列中。
  • Node.js 中,Event Loop 过程
    • 1,执行全局 Script 的同步代码
    • 2,执行 microtask 微任务,先执行所有 Next Tick Queue 中的所有微任务,再执行 Other Microtask Queue 中的所有任务
    • 3,开始执行 macrotask 宏任务,共 6 个阶段,从第 1 个阶段开始执行相应每一个阶段 macrotask 中的所有任务,注意,这里是所有每个阶段宏任务队列的所有任务,在浏览器的 Event Loop 中是只取宏队列的第一个任务出来执行,每一个阶段的 macrotask 任务执行完毕后,开始执行微任务,也就是步骤 2
    • 4,Timers Queue --> 步骤 2 --> I/O Queue --> 步骤 2 --> Check Queue --> 步骤 2 --> Close Callback Queue --> 步骤 2 --> Timers Queue …
    • 5,这就是 Node 的 Event Loop
  • Node 11.x 新变化
    • 现在 node 11 在 timer 阶段的 setTimeout,setInterval … 和在 check 阶段的 immediate 都在 node 11 里面,都修改为一旦执行一个阶段里的一个任务就立刻执行微任务队列。为了和浏览器更加趋同。

【Day02】测试 Primise、setTimeout等的执行顺序相关推荐

  1. TestNG测试框架之测试用例的执行顺序分析

    既然是讨论执行顺序问题,那么用例肯定是批量执行的,批量执行的方法有mvn test.直接运行testng.xml文件,其中直接运行testng.xml文件的效果与pom文件中配置执行testng.xm ...

  2. java代码块执行顺序_Java笔记 | Java代码块执行顺序测试

    最近笔试常常遇到考察Java代码块执行顺序的题目,网上查看博客错漏百出,特地自己测试了一下. 如有错漏,希望路过的大佬指出来,以便我进行更改. 先上代码吧! public class ClassA { ...

  3. java构造函数的执行顺序,java构造函数和初始化函数的执行顺序

    1,静态变量.静态代码块.变量.普通代码块.mian方法.构造函数的执行顺序是:(静态变量.静态代码块)>    main方法 >(变量.普通代码块)>构造函数. 2,如果子类调用了 ...

  4. 【异步系列二】Promise原理及执行顺序详解

    前言 Promise 是 javascript 中非常重要的一环,熟悉它是必须的,而且在面试中也常常会问到相关面试题. 在了解 Promise 之前,需要了解什么是异步编程,可以参考我的一篇文章:Ja ...

  5. 前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序

    『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到. 我会查阅一些资料并可能加上自己的理解,来记录这些问题.更多文章请前往我的个人博客 ...

  6. Junit指定测试执行顺序

    原文链接: Test execution order 原文日期: 2012年12月06日 翻译日期: 2014年7月2日 翻译人员: 铁锚 说明: Junit4.11版本及以后才支持,建议升级到最新版 ...

  7. Promise和setTimeout执行顺序 面试题

    看到过下面这样一道题: (function test() {setTimeout(function() {console.log(4)}, 0);new Promise(function execut ...

  8. junit 测试执行顺序_JUnit 5中的测试执行顺序

    junit 测试执行顺序 一般实践认为,自动化测试应能够独立运行且无特定顺序,并且测试结果不应依赖于先前测试的结果. 但是在某些情况下,可以证明特定的测试执行顺序是正确的,尤其是在集成或端到端测试中. ...

  9. JUnit 5中的测试执行顺序

    一般实践认为,自动化测试应能够独立运行且无特定顺序,并且测试结果不应依赖于先前测试的结果. 但是在某些情况下,可以证明特定的测试执行顺序是正确的,尤其是在集成或端到端测试中. 默认情况下,在JUnit ...

最新文章

  1. hive mysql 删除表_Hive-删除表(drop、truncate的区别)
  2. 【PAT】A1060 Are They Equal *
  3. 前端学习(3055):vue+element今日头条管理-反馈
  4. Scrapy网络爬虫框架实际案例讲解,Python爬虫原来如此简单!
  5. ASP.NET的ADO(ActiveX Data Objects)
  6. Cesium中HeadingPitchRoll
  7. NOI2004 郁闷的出纳员 splay
  8. Android studio——百度地图
  9. sql注入总结(一)
  10. 装完nvme固态经常蓝屏_方案解决:NVMe SSD安装Win7蓝屏0x0000007B快速解决方案
  11. P1_M4_L5 Lateral Dynamic Bicycle Model(自行车模型的横向动力学建模)
  12. Android 3D画廊采用Gallery实现无限循环、自动轮播
  13. 电脑计算机找不到指定的程序,光驱双击显示找不到应用程序。怎么办?
  14. 在手机屏幕上移动APP的两种方式
  15. 2022年8月又更新了:房测之友(BMF2018)免数据库版BMFse,有点高大上的样子
  16. esaywechat 微信公众号jsapi支付
  17. 计算机vb中的缺省是什么意思,请问缺省.既然缺省的意思为默认可是为什么不 – 手机爱问...
  18. 记忆化搜索例题 记忆化搜索
  19. 淘宝下单时出现关单提醒
  20. JMeter - 如何测试REST API / 微服务

热门文章

  1. 《Python数据分析常用手册》NumPy和Pandas
  2. media player的显示模式 winform
  3. 字符缓冲输入流 BufferedReader java
  4. 爬虫-请求类对象的创建-Request类
  5. mysql-数据库的设计三范示与ER模型
  6. mysql-多表查询-内联查询左查询
  7. 随机生成一组不重复的随机数组
  8. Jetty9 源码初解(2)——IO之Connection
  9. [20150805]提升scn4.txt
  10. 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》