同步任务和异步任务(微任务和宏任务)
同步任务和异步任务(微任务和宏任务)
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
- 执行到2,把setTimeout放入异步的任务队列中(宏任务)
- 执行到3,把process.nextTick放入异步任务队列中(微任务)
- 执行到4,上面提到promise里面是同步任务,所以输出7,再将then放入异步任务队列中(微任务)
- 执行到5,同2
- 上面的同步任务全部完成,开始进行异步任务
- 先执行微任务,发现里面有两个微任务,分别是3,4压入的,所以输出6 8
- 再执行一个宏任务,也就是第一个setTimeout
- 先输出2,把process.nextTick放入微任务中,再如上promise先输出4,再将then放入微任务中
- 再执行所以微任务输出输出3 5
- 同样的,再执行一个宏任务setTImeout2,输出9 11 在执行微任务输出10 12
- 所以最好的顺序为:1 7 6 8 2 4 3 5 9 11 10 12
欢迎指正!
同步任务和异步任务(微任务和宏任务)相关推荐
- JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数
文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在我们学习JavaScript中,我们知道,JavaScript的执行环境是单线程的.所谓单线程是指一次只能完成一个任务,如果有多个任务,就必须排队 ...
- 一篇文章理解JS中同步任务和异步任务以及宏任务与微任务的原理和执行机制
前言: javascript是一种单线程编程语言, 一般来说它的执行顺序是按照从上到下执行,但是有些特殊情况则会改变这样的执行顺序,我们需要理解和掌握其中的原理,需要了解同步任务和异步任务以及宏任务和 ...
- js回调执行顺序,同步任务与异步任务,宏任务与微任务
JS执行顺序 JS是单线程的,即一段时间只能执行一个任务.执行一段代码,js总是按照顺序执行的,只不过在执行的过程中不会等待异步任务. 同步任务与异步任务 同步任务:立即执行的任务,直接被主线程读取并 ...
- 同步调用和异步调用两者之间的区别
前言 提到同步调用和异步调用两者的区别,首先笔者是从微服务间通讯方式角度出发来阐述这两者的区别. 同步通讯 调用方需要等待执行方的调用结果.(就像打电话一样,需要实时响应) 典型就是:Dubbo的 ...
- 同步通讯和异步通讯的区别
一.同步通讯 什么是同步通讯? 在我们的生活经常碰到,比如:你和一个妹子视频通话,一旦视频电话接通,你们就建立了同步通讯: 你讲的每一句话每个动作都是立即反馈给对方的,是实时的: 但如果我们在视频通话 ...
- 同步任务和异步任务详解
同步任务和异步任务 同步和异步操作的区别就是是否阻碍后续代码的执行. 同步任务是那些没有被引擎挂起.在主线程上排队执行的任务.只有前一个任务执行完毕,才能执行后一个任务. 异步任务是那些被引擎放在一边 ...
- 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...
- asio boost 异步错误处理_boost::ASIO的同步方式和异步方式
http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...
- 第106天:Ajax中同步请求和异步请求
同步请求和异步请求的区别 1.同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的.信息错误又要重新 ...
最新文章
- 梭子鱼任命James Forbes-May为亚太区销售副总裁
- 【Kaggle-MNIST之路】CNN结构再改进+交叉熵损失函数(六)
- tensorflow教程 开始——Premade Estimators(预制评估器)
- python多进程编程 多个函数并发执行_python并发编程之多进程编程
- PAT_B_1034_Java(20分)
- LeetCode之Number Complement
- mac下卸载jdk1.7
- Linux中errno的含义
- Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录
- java ssh完整配置文件_ssh框架整合笔记---配置文件
- 直播app源代码,单例模式
- 毕业论文可能用到的一些东西
- 翻译: 中国北斗卫星导航系统 全球导航卫星系统 (GNSS)
- 新浪微博批量登录获取cookie
- 58欧氏空间05——对称变换和对称矩阵、实对称矩阵的标准形、正交相似
- java 批量设置单元格边框,VC下设置Excel单元格的边框 (转)
- python分析方向的第三方库_Python 机器学习方向的第三方库是
- 入职8年程序员被怼!网友:不懂业务,滚犊子!
- 机器人教育在STEM课程中的设计研究
- 全球及中国可穿戴科技设备行业前景动态及投资趋势预测报告2022-2027年
热门文章
- 百度/Google 高级搜索语法大全
- [置顶]R语言 ggplot2包
- 多媒体——图片——使用相机拍摄图片
- 安卓调起高德百度第三方地图进行导航
- sim808模块收发送短信
- java怎么打印星期,在任何日期打印出星期几
- python音乐可视化效果_Python 一个漂亮的音乐节奏可视化方案!我觉得可行!
- 串口RS232/485/UART转CANbus总线转换器网关CSM100模块CANCOM
- 转:敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagra
- CloseableHttpClient方式配置代理服务器访问外网