MST
星途 面试题库

面试题:JavaScript 数组创建在异步操作场景下的应用

你需要从三个不同的 API 接口获取数据,每个接口返回的数据都是一个数组。获取数据的操作是异步的,使用 `fetch` 函数模拟。获取到数据后,你要将这三个数组合并成一个新数组,并且每个数组中的元素在新数组中保持原顺序。请用 JavaScript 实现,并说明你在创建和合并数组过程中,如何处理异步操作可能带来的问题,以及为什么选择这种数组创建和合并的方式。
44.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function fetchData(url) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // 模拟异步操作返回数组数据
            resolve([Math.random() * 100]);
        }, 1000);
    });
}

async function combineArrays() {
    try {
        const url1 = 'api1';
        const url2 = 'api2';
        const url3 = 'api3';

        const [data1, data2, data3] = await Promise.all([
            fetchData(url1),
            fetchData(url2),
            fetchData(url3)
        ]);

        return [...data1, ...data2, ...data3];
    } catch (error) {
        console.error('Error fetching data:', error);
        return [];
    }
}

// 调用函数
combineArrays().then(result => {
    console.log('Combined Array:', result);
});
  1. 处理异步操作可能带来的问题
    • 使用 Promise.all 来处理多个异步操作。Promise.all 接收一个 Promise 数组,只有当所有 Promise 都成功时,它才会以数组形式返回所有 Promise 的 resolved 值。如果任何一个 Promise 被 rejected,Promise.all 将会立即 rejected,并抛出第一个被 rejected 的 Promise 的错误。这样可以确保在所有数据都获取成功后再进行合并操作,避免部分数据缺失。
  2. 选择这种数组创建和合并方式的原因
    • 数组创建:通过 fetchData 函数返回的 Promise 模拟从 API 获取数据,符合实际开发中异步获取数据的场景。fetch 本身返回的就是一个 Promise,这里用 setTimeout 模拟异步返回数据。
    • 数组合并:使用展开运算符 ... 来合并数组。这种方式简洁明了,能保持数组元素的原顺序,同时性能较好。相比于传统的 concat 方法,展开运算符在现代 JavaScript 环境中更简洁且高效,尤其是在合并多个数组时。