在JavaScript中,处理并发异步任务并依次获取它们的结果可以通过多种方式实现。以下是几种常见的方法:
Promise.all
Promise.all
可以并行执行多个异步任务,并在所有任务完成后返回一个包含所有结果的数组。结果的顺序与传入的Promise数组顺序一致。
const task1 = () => new Promise(resolve => setTimeout(() => resolve('Result 1'), 1000));
const task2 = () => new Promise(resolve => setTimeout(() => resolve('Result 2'), 500));
const task3 = () => new Promise(resolve => setTimeout(() => resolve('Result 3'), 1500));
Promise.all([task1(), task2(), task3()])
.then(results => {
console.log(results); // ['Result 1', 'Result 2', 'Result 3']
})
.catch(error => {
console.error(error);
});
async/await
和 for
循环如果你希望依次执行异步任务并获取结果,可以使用 async/await
结合 for
循环。
const task1 = () => new Promise(resolve => setTimeout(() => resolve('Result 1'), 1000));
const task2 = () => new Promise(resolve => setTimeout(() => resolve('Result 2'), 500));
const task3 = () => new Promise(resolve => setTimeout(() => resolve('Result 3'), 1500));
async function runTasks() {
const tasks = [task1, task2, task3];
const results = [];
for (const task of tasks) {
const result = await task();
results.push(result);
}
console.log(results); // ['Result 1', 'Result 2', 'Result 3']
}
runTasks();
reduce
和 async/await
你也可以使用 reduce
来依次执行异步任务并收集结果。
const task1 = () => new Promise(resolve => setTimeout(() => resolve('Result 1'), 1000));
const task2 = () => new Promise(resolve => setTimeout(() => resolve('Result 2'), 500));
const task3 = () => new Promise(resolve => setTimeout(() => resolve('Result 3'), 1500));
async function runTasks() {
const tasks = [task1, task2, task3];
const results = await tasks.reduce(async (previousPromise, task) => {
const results = await previousPromise;
const result = await task();
results.push(result);
return results;
}, Promise.resolve([]));
console.log(results); // ['Result 1', 'Result 2', 'Result 3']
}
runTasks();
for...of
和 async/await
与 for
循环类似,for...of
也可以用来依次执行异步任务。
const task1 = () => new Promise(resolve => setTimeout(() => resolve('Result 1'), 1000));
const task2 = () => new Promise(resolve => setTimeout(() => resolve('Result 2'), 500));
const task3 = () => new Promise(resolve => setTimeout(() => resolve('Result 3'), 1500));
async function runTasks() {
const tasks = [task1, task2, task3];
const results = [];
for (const task of tasks) {
const result = await task();
results.push(result);
}
console.log(results); // ['Result 1', 'Result 2', 'Result 3']
}
runTasks();
Promise.allSettled
如果你希望即使某些任务失败也能获取所有任务的结果,可以使用 Promise.allSettled
。
const task1 = () => new Promise(resolve => setTimeout(() => resolve('Result 1'), 1000));
const task2 = () => new Promise((resolve, reject) => setTimeout(() => reject('Error in Task 2'), 500));
const task3 = () => new Promise(resolve => setTimeout(() => resolve('Result 3'), 1500));
Promise.allSettled([task1(), task2(), task3()])
.then(results => {
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`Task ${index + 1} succeeded:`, result.value);
} else {
console.log(`Task ${index + 1} failed:`, result.reason);
}
});
});
Promise.all
或 Promise.allSettled
。async/await
结合 for
循环、for...of
或 reduce
。根据你的需求选择合适的方法来处理并发或依次执行的异步任务。