遇到await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,继续执行await后面的代码。
async function test1() {
console.log('start test1'); // 1
console.log(await test2()); //发生中断 //发生继续
console.log('end test1'); // test2()执行完毕 // 7
}
async function test2() {
console.log('test2'); // 2
// 从这里开始中断,跳出test1(),开始执行test1()外面的代码
// test1()外面的代码执行完毕后继续执行这里 // 6.1
return 'return test2 value' // 6.2
//第一个宏任务执行完毕,开始执行微任务
}
test1();
console.log('start async'); // 3 同步
setTimeout(() => { // setTimeout推入宏任务队列
console.log('setTimeout'); //执行第二个宏任务 // 9
}, 0);
new Promise((resolve, reject) => {
console.log('promise1'); // 4 同步
resolve();
}).then(() => { // promise.then推入微任务队列<1>
console.log('promise2'); // // 8
});
console.log('end async'); // 5 同步(所有同步代码执行完毕)
输出结果
start test1
test2
start async
promise1
end async
return test2 value
end test1
promise2
setTimeout
- 只有resolve()之后,传递给then时,then中的函数才会被推到微任务中
- 一个微任务里面产生的新的微任务,是在当前微任务队列的后面添加,而不是下一轮的微任务。
总结
promise是立即执行的,它创建的时候就会执行,不存在将promise推入微任务中的说法;
resolve()是用来表示promise的状态为fullfilled,相当于只是定义了一个有状态的Promise,但是并没有调用它;
promise调用then的前提是promise的状态为fullfilled;
只有promise调用then的时候,then里面的函数才会被推入微任务中;
————————————————————————————
ps(愚见):
- 宏任务:
整体 script, setTimeout, setInterval,UI交互事件,setImmediate(Node.js) - 微任务:
Promise, process.nextTick(Node 版 setTimeout,在event loop 的下一次循环中调用回调函数)
网友评论