- 首先要知道,在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,只能由浏览器或宿主环境传递给JavaScript引擎一段任务,然后将其顺序执行。这就是宿主环境发起的任务。我们称其为宏观任务。
- 在ES5之后,JavaScript引进了promise,使得JavaScript引擎可以自己发起执行任务,我们称其为微观任务。
- 每次执行任务时我们可以理解为一个宏观任务,每次都是执行完一个宏观任务再执行下一个宏观任务,而promise在执行时会返回一个异步任务,这时候怎么办呢,JavaScript引擎要保证这些异步任务要在同一个宏观任务中执行,因此就出现了微观任务队列。
- 有了这个机制,在执行任务时,JavaScript将promise产生的异步任务加入到宏观任务尾部的微观任务队列中,而setTimeout是由宿主发起的任务,自然就是一个宏观任务,因此排在了前一个宏观任务的后面执行。
- 也就是说,正常情况下,promise.then中执行的任务一定会在setTimeout之前执行。
- 文章链接: http://blog.cirzear.cn/?p=106
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!