为什么setTimeout在promise后执行

  • 首先要知道,在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,只能由浏览器或宿主环境传递给JavaScript引擎一段任务,然后将其顺序执行。这就是宿主环境发起的任务。我们称其为宏观任务。
  • 在ES5之后,JavaScript引进了promise,使得JavaScript引擎可以自己发起执行任务,我们称其为微观任务。
  • 每次执行任务时我们可以理解为一个宏观任务,每次都是执行完一个宏观任务再执行下一个宏观任务,而promise在执行时会返回一个异步任务,这时候怎么办呢,JavaScript引擎要保证这些异步任务要在同一个宏观任务中执行,因此就出现了微观任务队列。
  • 有了这个机制,在执行任务时,JavaScript将promise产生的异步任务加入到宏观任务尾部的微观任务队列中,而setTimeout是由宿主发起的任务,自然就是一个宏观任务,因此排在了前一个宏观任务的后面执行。
  • 也就是说,正常情况下,promise.then中执行的任务一定会在setTimeout之前执行。
发布了16 篇原创文章 · 获赞 11 · 访问量 5728

猜你喜欢

转载自blog.csdn.net/Cirzearchenille/article/details/103737001