js事件循环,执行顺序的问题

发布于 2022-09-13 01:01:51 字数 1115 浏览 25 评论 0

最近在研究事件循环,看到了一篇不错的博文,阅读学习后,对于博主的举的一个例子,有些疑惑,大家帮忙看看!

console.log('1')

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

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

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,7,6,8,2,4,3,5,9,11,10,12
但是我在node中运行里一下,输出顺序是1 7 6 8 2 4 9 11 3 10 5 12

我个人理解的是,在第二轮事件循环的时候,执行setTimeout1, setTimeout2 把其中的微任务,放到一个队列中,setTimeout1,setTimeout2执行完后,执行微任务-----> [process2,then2,process3, then3], 但是输出顺序process3提到了then2前面变成--->
[process2,process3,then2, then3]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浮光之海 2022-09-20 01:01:51

看到process.nextTick就不用期望什么顺序了。官方文档解释事件循环已经吧process.nextTick单独拿出来说了

You may have noticed that process.nextTick() was not displayed in the diagram, even though it's a part of the asynchronous API. This is because process.nextTick() is not technically part of the event loop. Instead, the nextTickQueue will be processed after the current operation is completed, regardless of the current phase of the event loop. Here, an operation is defined as a transition from the underlying C/C++ handler, and handling the JavaScript that needs to be executed.

看还是看官方的文档比较妥当

神妖 2022-09-20 01:01:51

我记得node在某个版本时候改过promise的调度,具体是哪个有点忘了,你可以搜搜看。记得好像是V8的实现问题,当时的chrome貌似也有问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文