console.log('1');
setTimeout(function() {
console.log('2');
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})
setTimeout(function() {
console.log('9');
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})
先分析代码的运行步骤:
1 代码从上向下执行
console.log(‘1’); 打印出 1
console.log(‘7’); 打印出 7
2 遇到 宏任务 setTimeout 放到异步队列中
遇见 微任务 Promise 放到 异步队列中
3 主进程 代码执行完毕 要去异步队列中 找寻是否有要执行的 任务
发现异步队列中有要执行的任务 就要进行 处理
4 首先 在异步队列中 有 宏任务 和 微任务
先执行 微任务 然后在执行 宏任务
宏任务
第一个 宏任务
setTimeout(function() {
console.log(‘2’);
new Promise(function(resolve) {
console.log(‘4’);
resolve();
}).then(function() {
console.log(‘5’)
})
})
第二个 宏任务
setTimeout(function() {
console.log(‘9’);
new Promise(function(resolve) {
console.log(‘11’);
resolve();
}).then(function() {
console.log(‘12’)
})
})
微任务
new Promise(function(resolve) {
console.log(‘7’);
resolve();
}).then(function() {
console.log(‘8’)
})
5 主进程 中 已经 打印了 1 7
依次 执行 微任务 8
在执行 宏任务
先执行第一个 宏任务 打印 2 4
原因:代码自上往下执行 先执行 同步代码 在执行异步代码 再打印 5
下一个 宏任务 同理 打印 9 11
微任务 12
整段代码输出为 :1,7,8,2,4,5,9,11,12 ;