MST
星途 面试题库

面试题:Node.js中如何优雅地处理多个异步任务并发时的错误

假设你有多个异步任务需要并发执行,例如使用Promise.all 发起多个API请求,若其中某个请求出错,如何优雅地捕获错误,同时又能保证其他未出错的任务继续执行,并最终将所有结果和错误信息整合处理,请详细说明实现思路并给出代码示例。
17.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 使用Promise.allSettled方法,它会等待所有Promise都完成(无论是成功还是失败),返回一个新的Promise,这个新Promise的结果是一个数组,数组中的每个元素对应原始Promise数组中每个Promise的结果,每个元素是一个对象,对象中有status(值为"fulfilled""rejected")和value(成功时的值)或reason(失败时的原因)属性。
    • 遍历Promise.allSettled返回的结果数组,区分成功和失败的任务,将成功的结果和失败的错误信息分别收集起来,最终进行整合处理。
  2. 代码示例
// 模拟多个异步API请求
function apiCall1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('API 1 Success');
        }, 1000);
    });
}
function apiCall2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(new Error('API 2 Error'));
        }, 1500);
    });
}
function apiCall3() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('API 3 Success');
        }, 2000);
    });
}

Promise.allSettled([apiCall1(), apiCall2(), apiCall3()])
   .then(results => {
        let successResults = [];
        let errorResults = [];
        results.forEach((result, index) => {
            if (result.status === 'fulfilled') {
                successResults.push(result.value);
            } else {
                errorResults.push(result.reason);
            }
        });
        // 整合处理
        console.log('成功的结果:', successResults);
        console.log('失败的错误信息:', errorResults);
    });