书接之前代码输出题目,
异步&事件循环
17.代码输出结果
function runAsync(x) {
const p = new Promise(r =>
setTimeout(() => r(x, console.log(x)), 1000)
);
return p;
}
function runReject(x) {
const p = new Promise((res, rej) =>
setTimeout(() => rej(`Error: ${x}`, console.log(x)), 1000 * x)
);
return p;
}
Promise.race([runReject(0), runAsync(1), runAsync(2), runAsync(3)])
.then(res => console.log("result: ", res))
.catch(err => console.log(err));
输出结果如下:
0
Error: 0
1
2
3
代码执行顺序如下:
- 可以看到
catch
捕获到第一个错误之后,后面的代码还会执行,不过不会再被捕获了。 all
和race
传入的数组中如果有会抛出异常的异步任务,那么只有最先抛出的错误会被捕获,并且是被then
的第二个参数或者后面的catch
捕获,但并不会影响数组中其他的异步任务的执行。
18.代码输出结果
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
async1();
console.log('start')
输出结果如下:
async1 start
async2
start
async1 end
代码执行顺序如下:
- 首先,调用
async1()
函数,进入async1
的执行上下文 - 在
async1
函数中,打印出 "async1 start" - 执行
await async2()
,进入async2
的执行上下文 - 在
async2
函数中,打印出 "async2" async2
函数执行完毕,跳出async1
- 在全局上下文中,打印出 "start"
- 在一轮宏任务执行完成后,再来执行
await
后面的async1 end