2018-06-08 宏任务和微任务

js先把宏任务放进宏任务队列里,再把微任务放进微任务队列里,执行的时候先执行宏任务队列里的一个任务,再把微任务队列里的所有任务执行完毕,再去执行宏任务队列里的一个任务,再去把微任务清空......一直交替进行

1. macroTask(宏任务)

所有同步JS代码、setTimeout(),setInterval()的任务都是宏任务,它们会被加进Event Queue(宏任务的事件队列)

2. microTask(微任务)

所有promise和process.nextTick()都是微任务,它们也会被加进Event Queue(微任务的事件队列)

3. 面试题1

console.log('script start')
setImmediate(()=>{
  console.log('setImmediate')
})
setTimeout(()=>{
    console.log('setTimeout');
    process.nextTick(function() {  
        console.log('process.nextTick2');  
    });  
})
process.nextTick(function() {  
  console.log('process.nextTick1');  
});  
Promise.resolve().then(()=>{
    console.log('promise1')
}).then(()=>{
    console.log('promise2')
})

console.log('script end')

请问执行顺序?
若是刚启动nodejs,则是:

  1. script start
  2. script end
  3. process.nextTick1
  4. promise1
  5. promise2
  6. setTimeout
  7. process.nextTick2
  8. setImmediate

若不是刚启动,则是:

  1. script start
  2. script end
  3. process.nextTick1
  4. promise1
  5. promise2
  6. setImmediate
  7. setTimeout
  8. process.nextTick2

所以,先执行宏任务(所有同步的js代码),再清空微任务队列(promise1、promise2),再执行宏任务,由Event Loop的 3. check 可知,若是刚启动nodejs,则setTimeout在前,不然都是set Immediate在前

4. 面试题2

setTimeout(function(){  
  console.log('1')  
});  
  
new Promise(function(resolve){  
  console.log('2');  
}).then(function(){  
      console.log('3')  
    });  
  
console.log('4');  

2 4 3 1
因为2是同步代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,531评论 8 265
  • JavaScript单线程机制 JavaScript的一个语言特性(也是这门语言的核心)就是单线程。什么是单线程呢...
    October_yang阅读 529评论 0 1
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,747评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • Warning:没有看过这部电影的人强烈推荐看一下,同时强烈不建议看电影前看本文,有非常之严重的剧透!! 看...
    诸葛兔阅读 597评论 1 1