结果是倒序输出的 主要是没搞明白promise这个什么时候执行的?能解释下吗?为什么promise比定时器这个异步先执行而又比console.log(3)
后执行?
setTimeout(function () {
console.log(1);
}, 0);
Promise.resolve().then(function () {
console.log(2);
});
console.log(3);
结果是倒序输出的 主要是没搞明白promise这个什么时候执行的?能解释下吗?为什么promise比定时器这个异步先执行而又比console.log(3)
后执行?
setTimeout(function () {
console.log(1);
}, 0);
Promise.resolve().then(function () {
console.log(2);
});
console.log(3);
这应该是属于“宏观任务微观任务”的知识,谷歌相关的关键词就能出来一大堆详细解释的文章了,这里再重复搬运别人的答案不是太合适,题主自己去搜索一下比较合适,这里附一个MDN的链接:https://developer.mozilla.org...
一些异步任务的回调会依次进入macro task queue,等待后续被调用,这些异步任务包括:
setTimeout
setInterval
setImmediate (Node独有)
requestAnimationFrame (浏览器独有)
I/O
UI rendering (浏览器独有)
另一些异步任务的回调会依次进入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
13 回答12.7k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
6 回答804 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决
这是三个层级了,同步先于微任务先于宏任务
console.log(3);
是同步代码,Promise
是微任务,setTimeout
是宏任务