我总结了三种方式(A,B,C),可以实现多个异步任务同时执行,并在所有任务完成后执行其他操作,欢迎大家一起探讨。
A. 使用Promise.all()方式实现:
Promise.all()方法用于等待多个Promise同时完成,并将它们的结果以数组的形式返回。可以按照以下步骤使用Promise.all()来实现并行执行多个异步任务:

创建多个Promise对象:每个Promise对象代表一个异步任务。
将这些Promise对象放入一个数组中。
使用Promise.all()方法:传入包含多个Promise的数组,等待所有Promise完成。
处理完成后的结果:在Promise.all()的回调函数中,可以获取到所有Promise的解析结果。

function fetchDataFromServer1(): Promise<string> {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Data from Server 1');
    }, 2000);
  });
}

function fetchDataFromServer2(): Promise<string> {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Data from Server 2');
    }, 3000);
  });
}

Promise.all([fetchDataFromServer1(), fetchDataFromServer2()])
  .then((results) => {
    console.log(results[0]); // 输出 'Data from Server 1'
    console.log(results[1]); // 输出 'Data from Server 2'
    // 在这里执行所有任务完成后的其他操作
  })
  .catch((error: BusinessError) => {
    console.error('Error:', error);
  });

B:使用async/await
async/await是处理异步操作的语法糖,使得异步代码更加直观和易读。可以按照以下步骤使用async/await来实现并行执行多个异步任务:

定义一个异步函数:使用async关键字声明一个函数。
在函数内部,创建多个Promise对象:每个Promise对象代表一个异步任务。
使用await关键字等待Promise.all()的解析结果:将多个Promise放入数组中,并使用Promise.all()等待它们完成。

async function concurrentOperations() {
  const promise1 = fetchDataFromServer1();
  const promise2 = fetchDataFromServer2();
  try {
    const [result1, result2] = await Promise.all([promise1, promise2]);
    console.log(result1);
    console.log(result2);
    // 在这里执行所有任务完成后的其他操作
  } catch (error: BusinessError) {
    console.error('Error:', error);
  }
}

concurrentOperations();

C: 使用TaskPool(多线程并发)
如果需要处理更复杂的并发场景,如CPU密集型任务,可以使用TaskPool来管理多线程并发。TaskPool允许在同一时间段内同时执行多段代码,提高程序的并发处理能力。使用TaskPool的步骤如下:

创建Task对象:每个Task对象代表一个需要在后台线程中执行的任务。
使用taskpool.execute()方法执行Task:将Task对象传递给taskpool.execute()方法,使其在后台线程中执行。
使用Promise.all()等待所有Task完成:将多个taskpool.execute()的返回值(Promise对象)放入数组中,使用Promise.all()等待它们完成。


function add(num1: number, num2: number): number {
  return num1 + num2;
}

function subtract(num1: number, num2: number): number {
  return num1 - num2;
}

async function concurrentFunc() {
  try {
    const task1 = new taskpool.Task(add, 1, 2);
    const task2 = new taskpool.Task(subtract, 3, 4);
    const results = await Promise.all([taskpool.execute(task1), taskpool.execute(task2)]);
    console.log(results); // 打印结果数组
    // 在这里执行所有任务完成后的其他操作
  } catch (e) {
    console.error("Error: " + e);
  }
}

concurrentFunc();

在harmony next开发中使用这三种都可实现多个异步任务同时执行并在所有异步任务执行完再制定其他操作的需求


udebq3rr
1 声望0 粉丝