ES6----宏任务和微任务

简介: ES6----宏任务和微任务

什么是宏任务和微任务

JavaScript把异步任务分为两类:

宏任务( macrotask)

异步Ajax请求、

setTimeout、setlnterval、

文件操作

其它宏任务

微任务( microtask

Promise.then、.catch和.finallyprocess.nextTick

其它微任务

宏任务和微任务的执行顺序

每一个宏任务执行完之后,都会检查是否存在待执行的微任务,如果有,则执行完所有微任务之后,再继续执行下一个宏任务。

例如,去银行办业务的场景:

1.小云和小腾去银行办业务。首先,需要取号之后进行排队

宏任务队列

2.假设当前银行网点只有一个柜员,小云在办理存款业务时,小腾只能等待

单线程,宏任务按次序执行

3.小云办完存款业务后,柜员询问他是否还想办理其它业务?

当前宏任务执行完,检查是否有微任务

4.小云告诉柜员:想要买理财产品、再办个信用卡、最后再兑换点马年纪念币?

执行微任务,后续宏任务被推迟

5.小云离开柜台后,柜员开始为小腾办理业务

所有微任务执行完毕,开始执行下一个宏任务

微任务是宏任务的回调任务。

分析代码执行顺序

同步任务优先执行

优先执行同步任务,同步任务执行完成看同步任务是否有未完成的微任务,有则执行微任务。

// 异步任务
// 会先托管给宿主环境
// 后面没有其他的异步任务,最后执行
setTimeout( function() {
  console.log('1')
} )
// 同步任务
// 按代码顺序执行
// 第一个执行
new Promise(  function(resolve) {
  console.log('2')
  resolve()
})
// 同步任务(宏任务)的微任务
// 第三个执行
.then(function () {
  console.log('3')
})
// 同步任务
// 第二个执行
console.log('4')

分析:

1.先执行所有的同步任务

执行第12行、第23行代码

2.再执行微任务

执行第18行代码

3.再执行下一个宏任务

执行第5行代码

2
4
3
1

面试题

// 同步任务,第一个输出 输出1
console.log('1')
// 异步任务,交给宿主环境
// 同步任务及其微任务执行完,执行异步任务
// 第一个异步任务
setTimeout( function() {
  // 异步任务中的同步任务
  // 第四个输出2
  console.log('2')
  // 执行异步任务中的同步任务
  // 第五个输出3
  new Promise( function(resolve) {
    console.log('3')
    resolve()
  } )
  // 同步任务的微任务
  // 该异步任务中的同步任务已经全部执行完
  // 第六个输出4
  .then( function() {
    console.log('4')
  } )
} )
// 同步任务,第二个执行,创建Promise对象
// 创建Promise对象会执行函数参数
// 输出5
new Promise( function(resolve) {
  console.log('5')
  resolve()
} )
// 同步任务的微任务
// 同步任务执行完,查看同步任务是否有微任务
// 第三个输出 6
.then( function() {
  console.log('6')
} )
// 异步任务,交给宿主环境
// 第二个异步任务
setTimeout( function() {
  // 第七个输出7
  console.log('7')
  // 第八个 8
  new Promise( function(resolve) {
    console.log('8')
    resolve()
  } )
  // 第九个  9
  .then( function() {
    console.log('9')
  } )
} )
1
5
6
2
3
4
7
8
9

相关文章
|
2月前
|
JavaScript 前端开发
微任务与宏任务的区别
微任务与宏任务的区别
|
2月前
|
前端开发 JavaScript API
宏任务与微任务执行顺序及对比记录
宏任务与微任务执行顺序及对比记录
59 0
|
2月前
|
前端开发 JavaScript UED
|
10天前
|
JavaScript 前端开发
js中的宏任务与微任务
js中的宏任务与微任务
宏任务和微任务的执行顺序是怎样的
宏任务和微任务的执行顺序是怎样的
|
2月前
|
前端开发 JavaScript
微任务与宏任务
微任务与宏任务
17 1
|
2月前
|
存储 JavaScript 前端开发
JS的执行原理,一文了解Event Loop事件循环、微任务、宏任务
了解JavaScript的事件循环和任务队列对于处理异步任务至关重要。事件循环由主线程和任务队列组成,当主线程执行完同步任务后,会检查任务队列,按顺序执行宏任务和微任务。宏任务包括`setTimeout`等,微任务如`Promise`的回调。在实际开发中,事件循环保证了代码的非阻塞执行,提高了用户体验。例如,`setTimeout`的回调会在当前宏任务结束后,所有微任务执行完才会执行。理解这一机制对于解决面试中的异步问题非常有帮助。
37 0
JS的执行原理,一文了解Event Loop事件循环、微任务、宏任务
|
2月前
|
JavaScript 前端开发 调度
(详解)js中什么是宏任务、微任务?宏任务、微任务有哪些?又是怎么执行的?
(详解)js中什么是宏任务、微任务?宏任务、微任务有哪些?又是怎么执行的?
73 1
|
2月前
|
JavaScript 前端开发
JS宏任务和微任务
JS宏任务和微任务
54 0
|
2月前
|
JavaScript 前端开发
什么是宏任务和微任务
什么是宏任务和微任务
134 0