面试题答案
一键面试1. 异步迭代器与错误处理基础
在JavaScript中,异步迭代器使用async function
和for await...of
语法来处理异步操作。当异步迭代器在执行过程中抛出错误时,错误会按照特定机制传播。
2. 错误传播机制
- 同步错误:如果在异步迭代器的同步代码部分抛出错误,它会立即传播,就像普通同步函数一样。例如:
async function* asyncGenerator() {
throw new Error('同步错误');
yield 1;
}
async function main() {
try {
for await (const value of asyncGenerator()) {
console.log(value);
}
} catch (error) {
console.log('捕获到错误:', error.message);
}
}
main();
- 异步错误:当异步操作(如
Promise
)在异步迭代器中抛出错误时,错误会在await
处被捕获。例如:
async function* asyncGenerator() {
await Promise.reject(new Error('异步错误'));
yield 1;
}
async function main() {
try {
for await (const value of asyncGenerator()) {
console.log(value);
}
} catch (error) {
console.log('捕获到错误:', error.message);
}
}
main();
3. 事件循环阶段对错误处理的影响
- 宏任务队列:宏任务(如
setTimeout
回调)在事件循环的一个新周期中执行。如果异步迭代器在宏任务中抛出错误,错误会在宏任务的执行上下文中传播。例如:
async function* asyncGenerator() {
yield 1;
setTimeout(() => {
throw new Error('宏任务中的错误');
}, 0);
yield 2;
}
async function main() {
try {
for await (const value of asyncGenerator()) {
console.log(value);
}
} catch (error) {
console.log('捕获到错误:', error.message);
}
}
main();
// 这里宏任务中的错误不会被外层try - catch捕获,因为它在不同的执行上下文
- 微任务队列:微任务(如
Promise.then
回调)在当前宏任务执行结束后,下一个宏任务开始前执行。如果异步迭代器在微任务中抛出错误,它会影响当前事件循环周期。例如:
async function* asyncGenerator() {
yield 1;
Promise.resolve().then(() => {
throw new Error('微任务中的错误');
});
yield 2;
}
async function main() {
try {
for await (const value of asyncGenerator()) {
console.log(value);
}
} catch (error) {
console.log('捕获到错误:', error.message);
}
}
main();
// 这里微任务中的错误不会被外层try - catch捕获,因为它在不同的执行上下文
4. 确保错误正确捕获和处理
为了确保在异步迭代器中错误能够被正确捕获和处理:
- 使用try - catch:在
for await...of
循环外部包裹try - catch
块,捕获异步迭代器同步或异步抛出的错误。 - 处理宏任务和微任务错误:对于宏任务和微任务中的错误,在各自的回调函数内添加
try - catch
。例如:
async function* asyncGenerator() {
yield 1;
setTimeout(() => {
try {
throw new Error('宏任务中的错误');
} catch (error) {
console.log('捕获宏任务错误:', error.message);
}
}, 0);
yield 2;
}
async function main() {
try {
for await (const value of asyncGenerator()) {
console.log(value);
}
} catch (error) {
console.log('捕获到错误:', error.message);
}
}
main();
async function* asyncGenerator() {
yield 1;
Promise.resolve().then(() => {
try {
throw new Error('微任务中的错误');
} catch (error) {
console.log('捕获微任务错误:', error.message);
}
});
yield 2;
}
async function main() {
try {
for await (const value of asyncGenerator()) {
console.log(value);
}
} catch (error) {
console.log('捕获到错误:', error.message);
}
}
main();
通过上述方式,可以有效地处理异步迭代器在事件循环不同阶段抛出的错误。