专栏首页杨龙飞前端js,timeout,promise执行顺序

js,timeout,promise执行顺序

总结

  1. macro-task包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。
  2. micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver

总的来说就是:

  1. 不同的任务会放进不同的任务队列之中。
  2. 先执行macro-task,等到函数调用栈清空之后再执行所有在队列之中的micro-task。
  3. 等到所有micro-task执行完之后再从macro-task中的一个任务队列开始执行,就这样一直循环。
  4. 当有多个macro-task(micro-task)队列时,事件循环的顺序是按上文macro-task(micro-task)的分类中书写的顺序执行的。

先执行正常栈中的代码,在执行micro-task,然后是macro-task.

也就是set开头的最后执行,promise在set之前,promise方法里的第一个执行方法不入栈,在正常栈里执行

console.log('golb1');
setImmediate(function() {
    console.log('immediate1');
    process.nextTick(function() {
        console.log('immediate1_nextTick');
    })
    new Promise(function(resolve) {
        console.log('immediate1_promise');
        resolve();
    }).then(function() {
        console.log('immediate1_then')
    })
})
setTimeout(function() {
    console.log('timeout1');
    process.nextTick(function() {
        console.log('timeout1_nextTick');
    })
    new Promise(function(resolve) {
        console.log('timeout1_promise');
        resolve();
    }).then(function() {
        console.log('timeout1_then')
    })
    setTimeout(function() {
        console.log('timeout1_timeout1');
    process.nextTick(function() {
        console.log('timeout1_timeout1_nextTick');
    })
    setImmediate(function() {
        console.log('timeout1_setImmediate1');
    })
    });
})
new Promise(function(resolve) {
    console.log('glob1_promise');
    resolve();
}).then(function() {
    console.log('glob1_then')
})
process.nextTick(function() {
    console.log('glob1_nextTick');
})

上面的代码要在node环境里执行,

结果如下:

golb1 glob1_promise glob1_nextTick glob1_then timeout1 timeout1_promise timeout1_nextTick timeout1_then immediate1 immediate1_promise immediate1_nextTick immediate1_then timeout1_timeout1 timeout1_timeout1_nextTick timeout1_setImmediate1

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • proxy思考

    windseek
  • es6中的let声明变量与es5中的var声明变量的区别,局部变量与全局变量

    windseek
  • promise思考

    windseek
  • dom啦3

    用户7873631
  • 防F12扒代码:按下F12关闭当前页面

    似水的流年
  • 防F12扒代码:按下F12关闭当前页面

    <script>   function fuckyou(){       window.close(); //关闭当前窗口(防抽)      wind...

    似水的流年
  • 熬夜7天,我总结了JavaScript与ES的25个重要知识点!

    说起JavaScript,大家都知道是一门脚本语言。那么ES是什么鬼呢?ES全称ECMAScript ,是JavaScript语言的国际标准。

    达达前端
  • 你不知道的console.log

    对于前端开发者,使用console.log() 次数绝对很多,但是大部分人认识的 console 对象还不是很全面,其实深入了解这些后,你会发现给开发过程带来很...

    游魂
  • 小视频源码,按返回键两次退出

    yunbaokeji柯基
  • console.log() 之外的调试技巧

    console.log( ) 是JS开发时常用的小工具,输出一些信息来辅助调试,console 还有很多有用的方法,下面介绍几个方便调试的用法 跟踪堆栈 例如想...

    dys

扫码关注云+社区

领取腾讯云代金券