插件窝 干货文章 JavaScript并发控制下如何依次获取所有异步任务的结果?

JavaScript并发控制下如何依次获取所有异步任务的结果?

Result resolve Promise const 808    来源:    2025-03-19

在JavaScript中,处理并发异步任务并依次获取它们的结果可以通过多种方式实现。以下是几种常见的方法:

1. 使用 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);
  });

2. 使用 async/awaitfor 循环

如果你希望依次执行异步任务并获取结果,可以使用 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();

3. 使用 reduceasync/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();

4. 使用 for...ofasync/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();

5. 使用 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.allPromise.allSettled
  • 依次执行:使用 async/await 结合 for 循环、for...ofreduce

根据你的需求选择合适的方法来处理并发或依次执行的异步任务。