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