面试题答案
一键面试设计思路
- 使用
try - catch
捕获错误:在async
函数内部,使用try - catch
块来捕获await
表达式可能抛出的错误。 - 任务取消机制:利用
AbortController
和AbortSignal
来实现任务取消。每个异步任务接受一个AbortSignal
实例,当接收到取消信号时,任务可以提前终止。
关键代码示例
// 创建一个模拟异步任务
function asyncTask(signal, taskName) {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
if (signal.aborted) {
reject(new Error('Task cancelled'));
} else {
resolve(`Task ${taskName} completed`);
}
}, 1000);
signal.addEventListener('abort', () => {
clearTimeout(timeout);
reject(new Error('Task cancelled'));
});
});
}
async function main() {
const controller = new AbortController();
const signal = controller.signal;
try {
const tasks = [
asyncTask(signal, 'A'),
asyncTask(signal, 'B'),
asyncTask(signal, 'C')
];
const results = await Promise.all(tasks);
console.log(results);
} catch (error) {
console.error('An error occurred:', error.message);
controller.abort(); // 取消其他未执行的任务
}
}
main();
在上述代码中:
asyncTask
函数模拟了一个异步任务,接受AbortSignal
实例作为参数。如果在任务执行过程中接收到取消信号,任务会被取消并抛出错误。main
函数中,使用Promise.all
来并行执行多个异步任务。通过try - catch
块捕获可能出现的错误,一旦捕获到错误,使用controller.abort()
来取消其他未执行的任务。