面试题答案
一键面试思路解释
- 处理相互依赖的异步操作:对于有依赖关系的操作,我们可以通过链式调用
then
方法来确保前一个操作完成后再执行下一个。 - 并行执行的异步操作:对于可以并行执行的操作,使用
Promise.all
方法,它会返回一个新的Promise,只有当所有传入的Promise都成功时,这个新Promise才会成功,只要有一个失败,它就会失败。 - 错误处理:在每个异步操作内部使用
try...catch
捕获错误,并使用Promise.reject
将错误传递出去。在Promise.all
或者链式调用的末尾使用.catch
统一捕获所有可能出现的错误,汇总错误信息。 - 性能优化:通过并行执行可以独立进行的操作,减少整体的执行时间。
代码实现
// 模拟异步操作函数
function asyncOperation1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
// 模拟成功
resolve('Operation 1 success');
} catch (error) {
reject(new Error('Operation 1 failed'));
}
}, 1000);
});
}
function asyncOperation2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
// 模拟成功
resolve('Operation 2 success');
} catch (error) {
reject(new Error('Operation 2 failed'));
}
}, 1500);
});
}
function asyncOperation3(dependentResult) {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
if (dependentResult.includes('success')) {
resolve('Operation 3 success');
} else {
reject(new Error('Operation 3 depends on previous success'));
}
} catch (error) {
reject(new Error('Operation 3 failed'));
}
}, 1200);
});
}
// 执行异步操作
async function executeAsyncOperations() {
try {
const [result1, result2] = await Promise.all([asyncOperation1(), asyncOperation2()]);
const result3 = await asyncOperation3(result1);
console.log('All operations completed successfully:', result1, result2, result3);
} catch (error) {
console.error('Error in one or more operations:', error.message);
}
}
executeAsyncOperations();
在上述代码中:
asyncOperation1
和asyncOperation2
是可以并行执行的异步操作,通过Promise.all
并行执行它们。asyncOperation3
依赖于asyncOperation1
的结果,所以在asyncOperation1
成功完成后,将其结果传递给asyncOperation3
并执行。- 在
executeAsyncOperations
函数中,使用try...catch
捕获可能出现的错误,并在捕获到错误时统一输出错误信息,实现了错误的汇总处理。