MST

星途 面试题库

面试题:Node.js Promise错误处理在复杂异步场景中的应用

在一个Node.js项目中,你需要同时发起多个异步操作(使用Promise),这些操作有的相互依赖,有的可以并行执行。请设计一个方案,既要保证正确处理每个异步操作的错误,又要确保所有操作完成后统一处理可能出现的错误汇总,同时要考虑性能优化。请给出详细的代码实现和思路解释。
27.3万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

思路解释

  1. 处理相互依赖的异步操作:对于有依赖关系的操作,我们可以通过链式调用 then 方法来确保前一个操作完成后再执行下一个。
  2. 并行执行的异步操作:对于可以并行执行的操作,使用 Promise.all 方法,它会返回一个新的Promise,只有当所有传入的Promise都成功时,这个新Promise才会成功,只要有一个失败,它就会失败。
  3. 错误处理:在每个异步操作内部使用 try...catch 捕获错误,并使用 Promise.reject 将错误传递出去。在 Promise.all 或者链式调用的末尾使用 .catch 统一捕获所有可能出现的错误,汇总错误信息。
  4. 性能优化:通过并行执行可以独立进行的操作,减少整体的执行时间。

代码实现

// 模拟异步操作函数
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();

在上述代码中:

  • asyncOperation1asyncOperation2 是可以并行执行的异步操作,通过 Promise.all 并行执行它们。
  • asyncOperation3 依赖于 asyncOperation1 的结果,所以在 asyncOperation1 成功完成后,将其结果传递给 asyncOperation3 并执行。
  • executeAsyncOperations 函数中,使用 try...catch 捕获可能出现的错误,并在捕获到错误时统一输出错误信息,实现了错误的汇总处理。