同步任务和异步任务(微任务和宏任务)

JavaScript是一门单线程语言

分为同步任务和异步任务

  • 同步任务是指在主线程上排队执行的任务,
    只有前一个任务执行完毕,才能继续执行下一个任务。

  • 异步任务指的是,不进入主线程、而进入"任务队列"的任务

    只有等主线程任务全部执行完毕,"任务队列"的任务才会进入主线程执行。

而异步任务分为宏任务和微任务

  • macro-task(宏任务):包括整体代码script,setTimeout,setInterval

  • micro-task(微任务):Promise,process.nextTick

    (Promise并不是完全的同步,在Promise中是同步任务,执行resolve或者reject回调的时候,此时是异步操作,会先将then/catch等放到异步任务中的微任务队列)

执行过程:

1.先执行所有同步任务,碰到异步任务放到任务队列中

2.同步任务执行完毕,开始执行当前所有的异步任务

3.先执行任务队列里面所有的微任务

4.然后执行一个宏任务

5.然后再执行所有的微任务

6.再执行一个宏任务,再执行所有的微任务·······依次类推到执行结束。

3-6的这个循环称为事件循环Event Loop

事件循环是JavaScript实现异步的一种方法,也是JavaScript的执行机制

简单分析下这个代码:

//1
console.log('1');
//2
setTimeout(function() {console.log('2');process.nextTick(function() {console.log('3');})new Promise(function(resolve) {console.log('4');resolve();}).then(function() {console.log('5')})
})
//3
process.nextTick(function() {console.log('6');
})
//4
new Promise(function(resolve) {console.log('7');resolve();
}).then(function() {console.log('8')
})
//5
setTimeout(function() {console.log('9');process.nextTick(function() {console.log('10');})new Promise(function(resolve) {console.log('11');resolve();}).then(function() {console.log('12')})
})
  1. 先执行1 输出1
  2. 执行到2,把setTimeout放入异步的任务队列中(宏任务)
  3. 执行到3,把process.nextTick放入异步任务队列中(微任务)
  4. 执行到4,上面提到promise里面是同步任务,所以输出7,再将then放入异步任务队列中(微任务)
  5. 执行到5,同2
  6. 上面的同步任务全部完成,开始进行异步任务
  7. 先执行微任务,发现里面有两个微任务,分别是3,4压入的,所以输出6 8
  8. 再执行一个宏任务,也就是第一个setTimeout
  9. 先输出2,把process.nextTick放入微任务中,再如上promise先输出4,再将then放入微任务中
  10. 再执行所以微任务输出输出3 5
  11. 同样的,再执行一个宏任务setTImeout2,输出9 11 在执行微任务输出10 12
  12. 所以最好的顺序为:1 7 6 8 2 4 3 5 9 11 10 12

欢迎指正!

同步任务和异步任务(微任务和宏任务)相关推荐

  1. JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在我们学习JavaScript中,我们知道,JavaScript的执行环境是单线程的.所谓单线程是指一次只能完成一个任务,如果有多个任务,就必须排队 ...

  2. 一篇文章理解JS中同步任务和异步任务以及宏任务与微任务的原理和执行机制

    前言: javascript是一种单线程编程语言, 一般来说它的执行顺序是按照从上到下执行,但是有些特殊情况则会改变这样的执行顺序,我们需要理解和掌握其中的原理,需要了解同步任务和异步任务以及宏任务和 ...

  3. js回调执行顺序,同步任务与异步任务,宏任务与微任务

    JS执行顺序 JS是单线程的,即一段时间只能执行一个任务.执行一段代码,js总是按照顺序执行的,只不过在执行的过程中不会等待异步任务. 同步任务与异步任务 同步任务:立即执行的任务,直接被主线程读取并 ...

  4. 同步调用和异步调用两者之间的区别

    前言   提到同步调用和异步调用两者的区别,首先笔者是从微服务间通讯方式角度出发来阐述这两者的区别. 同步通讯 调用方需要等待执行方的调用结果.(就像打电话一样,需要实时响应) 典型就是:Dubbo的 ...

  5. 同步通讯和异步通讯的区别

    一.同步通讯 什么是同步通讯? 在我们的生活经常碰到,比如:你和一个妹子视频通话,一旦视频电话接通,你们就建立了同步通讯: 你讲的每一句话每个动作都是立即反馈给对方的,是实时的: 但如果我们在视频通话 ...

  6. 同步任务和异步任务详解

    同步任务和异步任务 同步和异步操作的区别就是是否阻碍后续代码的执行. 同步任务是那些没有被引擎挂起.在主线程上排队执行的任务.只有前一个任务执行完毕,才能执行后一个任务. 异步任务是那些被引擎放在一边 ...

  7. 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO

    IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...

  8. asio boost 异步错误处理_boost::ASIO的同步方式和异步方式

    http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...

  9. 第106天:Ajax中同步请求和异步请求

    同步请求和异步请求的区别 1.同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的.信息错误又要重新 ...

最新文章

  1. 梭子鱼任命James Forbes-May为亚太区销售副总裁
  2. 【Kaggle-MNIST之路】CNN结构再改进+交叉熵损失函数(六)
  3. tensorflow教程 开始——Premade Estimators(预制评估器)
  4. python多进程编程 多个函数并发执行_python并发编程之多进程编程
  5. PAT_B_1034_Java(20分)
  6. LeetCode之Number Complement
  7. mac下卸载jdk1.7
  8. Linux中errno的含义
  9. Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录
  10. java ssh完整配置文件_ssh框架整合笔记---配置文件
  11. 直播app源代码,单例模式
  12. 毕业论文可能用到的一些东西
  13. 翻译: 中国北斗卫星导航系统 全球导航卫星系统 (GNSS)
  14. 新浪微博批量登录获取cookie
  15. 58欧氏空间05——对称变换和对称矩阵、实对称矩阵的标准形、正交相似
  16. java 批量设置单元格边框,VC下设置Excel单元格的边框 (转)
  17. python分析方向的第三方库_Python 机器学习方向的第三方库是
  18. 入职8年程序员被怼!网友:不懂业务,滚犊子!
  19. 机器人教育在STEM课程中的设计研究
  20. 全球及中国可穿戴科技设备行业前景动态及投资趋势预测报告2022-2027年

热门文章

  1. 百度/Google 高级搜索语法大全
  2. [置顶]R语言 ggplot2包
  3. 多媒体——图片——使用相机拍摄图片
  4. 安卓调起高德百度第三方地图进行导航
  5. sim808模块收发送短信
  6. java怎么打印星期,在任何日期打印出星期几
  7. python音乐可视化效果_Python 一个漂亮的音乐节奏可视化方案!我觉得可行!
  8. 串口RS232/485/UART转CANbus总线转换器网关CSM100模块CANCOM
  9. 转:敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagra
  10. CloseableHttpClient方式配置代理服务器访问外网