MST

星途 面试题库

面试题:JavaScript 复杂场景下函数方法并发使用与异常处理

假设有两个异步函数 `asyncFunction1` 和 `asyncFunction2`,它们分别返回 Promise。`asyncFunction1` 接收一个参数数组,会并发处理数组中的每个元素,处理过程中如果某个元素处理失败,需要记录失败信息并继续处理其他元素,最后返回成功处理的结果数组和失败信息数组。`asyncFunction2` 接收 `asyncFunction1` 的成功结果数组,再次并发处理,这次如果有失败情况,整个操作要终止并抛出错误。请用 JavaScript 实现这两个函数以及它们的调用逻辑,详细说明在并发处理过程中对异常情况的处理策略和所用到的函数方法原理。
39.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
// 模拟异步处理单个元素的函数
function processElement(element) {
    return new Promise((resolve, reject) => {
        // 模拟异步操作,比如随机成功或失败
        const success = Math.random() > 0.5;
        setTimeout(() => {
            if (success) {
                resolve(element * 2);
            } else {
                reject(`Element ${element} failed`);
            }
        }, 100);
    });
}

async function asyncFunction1(arr) {
    const successResults = [];
    const failureMessages = [];

    const promises = arr.map(async (element) => {
        try {
            const result = await processElement(element);
            successResults.push(result);
        } catch (error) {
            failureMessages.push(error.message);
        }
    });

    await Promise.all(promises);

    return { successResults, failureMessages };
}

async function asyncFunction2(successResults) {
    const promises = successResults.map(async (result) => {
        const newResult = await processElement(result);
        return newResult;
    });

    try {
        return await Promise.all(promises);
    } catch (error) {
        throw new Error(`Operation failed: ${error.message}`);
    }
}

// 调用逻辑
async function main() {
    const initialArray = [1, 2, 3, 4];
    const { successResults, failureMessages } = await asyncFunction1(initialArray);
    console.log('asyncFunction1 success results:', successResults);
    console.log('asyncFunction1 failure messages:', failureMessages);

    try {
        const finalResults = await asyncFunction2(successResults);
        console.log('asyncFunction2 final results:', finalResults);
    } catch (error) {
        console.error('asyncFunction2 error:', error.message);
    }
}

main();

异常处理策略和函数方法原理

  1. asyncFunction1 中的异常处理

    • 对数组中的每个元素使用 map 方法创建一个异步操作的 Promise 数组。
    • try...catch 块中处理每个元素的异步操作,成功则将结果加入 successResults 数组,失败则将错误信息加入 failureMessages 数组。
    • 使用 Promise.all 等待所有异步操作完成,这样即使有部分操作失败,也能继续处理其他元素。
  2. asyncFunction2 中的异常处理

    • 同样对 asyncFunction1 的成功结果数组使用 map 创建异步操作的 Promise 数组。
    • 使用 Promise.all 等待所有异步操作完成,如果其中有任何一个操作失败,Promise.all 会立即拒绝,并抛出错误,通过 try...catch 捕获并重新抛出带有更详细信息的错误,终止整个操作。
  3. processElement 函数

    • 模拟一个异步操作,随机成功或失败,使用 setTimeout 模拟异步延迟。
    • 通过 Promiseresolvereject 方法分别表示操作成功和失败。