书接之前代码输出题目,
异步&事件循环
23.代码输出结果
async function async1() {
await async2();
console.log('async1');
return 'async1 success'
}
async function async2() {
return new Promise((resolve, reject) => {
console.log('async2')
reject('error')
})
}
async1().then(res => console.log(res))
输出结果如下:
async2
Promise {<rejected>: 'error'}
代码执行顺序如下:
- 可以看到,如果
async
函数中抛出了错误,就会终止错误结果,不会继续向下执行 - 如果想要让错误不足之处后面的代码执行,可以使用
catch
来捕获
24.代码输出结果
const first = () => (new Promise((resolve, reject) => {
console.log(3);
let p = new Promise((resolve, reject) => {
console.log(7);
setTimeout(() => {
console.log(5);
resolve(6);
console.log(p)
}, 0)
resolve(1);
});
resolve(2);
p.then((arg) => {
console.log(arg);
});
}));
first().then((arg) => {
console.log(arg);
});
console.log(4);
输出结果如下:
3
7
4
1
2
5
Promise {<fulfilled>: 1}
代码执行顺序如下:
- 首先会进入
Promise
,打印出 3,之后进入下面的Promise
,打印出 7 ; - 遇到了定时器,将其加入宏任务队列;
- 执行
Promise p
中的resolve
,状态变为resolved
,返回值为 1; - 执行
Promise first
中的resolve
,状态变为resolved
,返回值为2 ; - 遇到
.then
,将其加入微任务队列; - 执行外面的代码,打印出 4 ;
- 这样第一轮宏任务就执行完了,开始执行微任务队列中的任务,先后打印出 1 和 2 ;
- 这样微任务就执行完了,开始执行下一轮宏任务,宏任务队列中有一个定时器,执行它,打印出 5 ,由于执行已经变为
resolved
状态,所以resolve(6)
不会再执行; - 最后
console.log(p)
打印出 Promise{: 1} ;