书接之前代码输出题目,
异步&事件循环
21.代码输出结果
async function async1() {
console.log('async1 start');
await new Promise(resolve => {
console.log('promise1')
resolve('promise1 resolve')
}).then(res => console.log(res))
console.log('async1 success');
return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')
输出结果如下:
srcipt start
async1 start
promise1
srcipt end
promise1 resolve
async1 success
async1 end
代码执行顺序如下:
22.代码输出结果
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
console.log("script start");
setTimeout(function () {
console.log("setTimeout");
}, 0);
async1();
new Promise(resolve => {
console.log("promise1");
resolve();
}).then(function () {
console.log("promise2");
});
console.log('script end')
输出结果如下:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
代码执行顺序如下:
- 开头定义了
async1
和async2
两个函数,但是并未执行,执行script
中的代码,所以打印出script start
; - 遇到定时器
Settimeout
,它是一个宏任务,将其加入到宏任务队列; - 之后执行函数
async1
,首先打打印出async1 start
; - 遇到
await
,加入微任务队列; - 然后跳出
async1
和async2
,遇到Promise
,打印出promise1
; - 遇到
resolve
,将其加入到微任务队列,然后执行后面的script
代码,打印出script end
; - 之后就该执行微任务队列了,首先打印出
async1 end
,然后打印出promise2
; - 执行完微任务队列,就开始执行宏任务队列中的定时器,打印出
setTimeout
。