promise这个是什么时候执行的?

结果是倒序输出的 主要是没搞明白promise这个什么时候执行的?能解释下吗?为什么promise比定时器这个异步先执行而又比console.log(3)后执行?

setTimeout(function () {
  console.log(1);
}, 0);

Promise.resolve().then(function () {
  console.log(2);
});

console.log(3);
阅读 2.5k
4 个回答

这是三个层级了,同步先于微任务先于宏任务

console.log(3);是同步代码,Promise是微任务,setTimeout是宏任务

这应该是属于“宏观任务微观任务”的知识,谷歌相关的关键词就能出来一大堆详细解释的文章了,这里再重复搬运别人的答案不是太合适,题主自己去搜索一下比较合适,这里附一个MDN的链接:https://developer.mozilla.org...

宏队列和微队列

宏队列,macrotask,也叫tasks。

一些异步任务的回调会依次进入macro task queue,等待后续被调用,这些异步任务包括:
setTimeout
setInterval
setImmediate (Node独有)
requestAnimationFrame (浏览器独有)
I/O
UI rendering (浏览器独有)

微队列,microtask,也叫jobs。

另一些异步任务的回调会依次进入micro task queue,等待后续被调用,这些异步任务包括:
process.nextTick (Node独有)
Promise
Object.observe
MutationObserver

示例

script标签里包含的就是第1个宏观任务,开始从上往下执行;
遇到setTimeout,将回调插入到宏观任务中x ms的位置,等待执行;
遇到newPromise,执行里面的代码;
发现有then,将then中的回调插入到微观任务中等待执行;
此时script标签的宏观任务执行完毕,查看微观队列中是否有任务,有,then的回调,执行;
全部的微观任务执行完毕后,查看宏观任务的队列中是否有任务,有,刚才setTimeout的回调,执行;
再次查看微观任务队列,无,再次查看宏观任务队列,无,执行完毕;

执行宏任务(代码块 / setTimeout回调 / 事件回调等) ==》 清空微任务(Promise回调,queueMicrotask 等)

1、执行整个代码块的宏任务1
2、setTimeout 创建新的宏任务2
3、Promise 回调创建微任务1
4、log 3
5、清空微任务 log 2
6、下一个宏任务 log 1

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题