关于js的单线程、怎么创建一个异步任务都是老生常谈的话题了,我们今天就总结一下js不同的异步操作到底执行顺序如何。

首先我们要明白js两种任务类型,一个是macrotask(宏任务),一个是 microtask(微任务)。一个宏任务就是一个事件循环,一个宏任务执行完毕后js就会执行下一个宏任务,而微任务就是在两个宏任务执行中间执行。

我们先给js中异步常见的异步操作来根据不同任务类型进行分类

宏任务

script(同步代码)

setTimeout

setInterval

setImmediate

I/O(ajax请求)

微任务

promise

node中的process.nextTick是将任务放到当前宏任务的队尾执行,比较特殊,也算是一个特殊的微任务。

console.log(1);

setTimeout(()=>console.log(2), 1)

setTimeout(()=> console.log(3), 0)

Promise.resolve().then(()=> console.log(4));

setImmediate(()=> console.log(5))

process.nextTick(()=> console.log(6))

console.log(7);

所以我们可以来测试下上面这段代码的执行顺序,首先肯定输出的是 1 7 因为他们两个是属于第一个宏任务中的代码,接下来是 6 当前宏任务结束后process.nextTick 执行。而在下一个宏任务执行之前,微任务promise会指向,所以下来是 4。同时我们要知道setTimeout的时间最小值是1所以 1 和 0 其实是一样的,2一定会在3之前执行。但是setImmediate和setTimeout(, 0)执行顺序其实不确定的,当我们将这段代码直接在node中执行,输出的是1764235,也就是说setImmediate后执行。但是我们将这段代码放到一个setTimeout中执行,输出的是1764523。

我们知道 setTimeout 的回调函数在 timer 阶段执行,setImmediate 的回调函数在 check 阶段执行,event loop 的开始会先检查 timer 阶段,但是在开始之前到 timer 阶段会消耗一定时间,所以就会出现两种情况:

timer 前的准备时间超过 1ms,满足 loop->time >= 1,则执行 timer 阶段(setTimeout)的回调函数

timer 前的准备时间小于 1ms,则先执行 check 阶段(setImmediate)的回调函数,下一次 event loop 执行 timer 阶段(setTimeout)的回调函数

这是对网上对这个现象的解释。

php 内部异步执行顺序,event_loop中不同异步操作的执行顺序相关推荐

  1. java 线程执行结束_java中怎么判断线程执行完毕

    java中怎么判断线程执行完毕 发布时间:2020-05-15 15:18:05 来源:亿速云 阅读:316 作者:Leah java中怎么判断线程执行完毕?针对这个问题,今天小编总结这篇有关线程判断 ...

  2. js中当等于最小值是让代码不执行_网页中JS函数自动执行常用三种方法

    本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: 2.在JS语句调用: function myfun ...

  3. mysql更改执行计划_11g中 connect by 语句执行计划改变

    从10.2.0.3升级到11.2.0.4的朋友,如果细心会发现,以下sql在11.2.0.4中执行效率变低(该sql主要是获取连接用户获取权限信息) select privilege#,level f ...

  4. python装饰器的顺序_python中装饰器的装饰顺序和执行顺序

    在python语言中"装饰器"模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用'@'符号加装饰器名就能达到目的.但如果同一个目标函数需要进行多次装饰 ...

  5. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  6. java代码的运行顺序_java中的代码块执行顺序

    输入代码 blic static void main(String[] args) { { int x = 10;//限定变量的声明周期 System.out.println(x); } Studen ...

  7. python3怎样交换数字顺序_python中怎么交换列的顺序

    DataFrame的列有时我们需要对添加的列或原来的列进行交换顺序.data = pd.DataFrame(np.arange(16).reshape(4,4),columns=list('abcd' ...

  8. MySQL查询时条件的顺序_mysql中查询条件的先后顺序问题?

    听一个讲座,说查询条件的顺序影响查询速度,比如一个先运行一个高门槛的条件,后低门槛,运行速度会相对快,请问有这种事么? 那么我在写thinkphp的查询语句的时候,是不是应该把高门槛的放在前面查询? ...

  9. 教你在Linux上使用ansible写“剧本”,定义一个“剧本”模板后,让控制集群自动执行我们剧本中所写的“剧情”,几个自动化运维的简单实例

    目录 1.loop的使用 2.使用when,当条件成立时才执行任务 3.notify和handler的使用 4.tags使用 5.处理任务失败 6. 构建一个jinja2模板 7.forks和seri ...

最新文章

  1. python自学到精通
  2. 解决selenium报错--unknown error: DevToolsActivePort file doesn‘t exist
  3. Error running ‘xxx-web-order‘: Unable to open debugger port : java.net.Socke
  4. ondestroy什么时候调用_尾调用和尾递归
  5. 使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6
  6. windows server 2003 IIS下配置PHP
  7. 怎么入门Java?java拦截器怎么配置
  8. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)
  9. docker 离线安装_企业级Docker私库Harbor安装详解
  10. 优秀文章收集,也有专题,改变了我的一些看法。
  11. group by 深入总结
  12. python函数可以返回多个函数值吗_python - 函数返回多个值是pythonic吗?
  13. inssider序列号_inSSIDer v4.2.1.109完美注册版
  14. QML QtLocation地图应用学习-4:行政区划
  15. Android招行一网通对接
  16. Coursera | Andrew Ng (01-week-2-2.6)—更多导数的例子
  17. 关于统计检验中P值的解释
  18. Python3.7在 Geany下编译出现SyntaxError: Non-UTF-8 code starting with '\xb3'错误及实例化方法时提示没有实参的解决方法。
  19. 怎么使用计算机播放音乐,怎么给电脑设置默认音乐播放器
  20. Swarm管理Docker集群

热门文章

  1. double小数点后最多几位_基金理财买入后,不断亏损,是最多本金亏光,还是会出现负值...
  2. Wireshark图解教程(简介、抓包、过滤器)
  3. Ubuntu如何搭建Django与Flup和Nginx环境?
  4. php_sapi常量,PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
  5. c语言程序设计课件第二章,c语言程序设计课件张元国 ISBN9787566300386 PPT第二章数据类型 运算符与表达式...
  6. 产品经理思维模型:创新价值曲线
  7. 少儿编程150讲轻松学Scratch(二)-制作过马路小游戏
  8. 前端工程师应该掌握哪些技能才方便找工作?
  9. 百度开发平台提交应用后进行官方认证审核失败?
  10. 用js来实现那些数据结构12(散列表)