美文网首页
Javascript执行机制(setTimeout/Promis

Javascript执行机制(setTimeout/Promis

作者: LeungJhowe | 来源:发表于2019-10-24 22:42 被阅读0次

遇到的一道关于javascript执行机制的面试题

   setTimeout(() => {
      console.log(1)
    })
    new Promise(resolve => {
      console.log(2)
      setTimeout(() => {
        resolve(3)
      })
      Promise.resolve().then(() => {
        console.log(4)
      })
    }).then((data) => {
      console.log(data)
    })
    console.log(5)
// 问输出顺序

Javascript执行机制(setTimeout/Promise)
JS sleep
注意:
①同循环下 node.js中的process.nexttrick的微任务会比promise 的then微任务更优先
②浏览器和node.js的微任务执行机制有点区别。浏览器中同级的setTimeout是一个整体,他们间的微任务不在同一个队列。而nodejs中setTimout和他们的微任务都会被提取出来添加到同一个队列。
例如

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

    new Promise(function (resolve) {
      console.log('7')
      resolve()
    }).then(function () {
      console.log('8')
    })

    setTimeout(function () {
      console.log('9')
      new Promise(function (resolve) {
        console.log('11')
        resolve()
      }).then(function () {
        console.log('12')
      })
    })

浏览器结果为:1,7,8,2,4,5,9,11,12
nodejs结果为:1,7,8,2,4,9,11,5,12
可以看到setTimeout函数的顺序就不一样了
浏览器下:setTimeout是一个整体,微任务在这个队列中,
整体的先执行主代码在执行微服务所以是
(2,4,5),(9,11,12)
括号代表一个setTimeout整体
nodejs下:setTimeout的主代码在宏任务队列,微任务在一个队列
(2,4,9,11),(5,12)
括号代表队列,第一个是setTimeout主代码执行队列,第二个是微任务队列
nodejs执行机制详解

相关文章

网友评论

      本文标题:Javascript执行机制(setTimeout/Promis

      本文链接:https://www.haomeiwen.com/subject/zrrjvctx.html