返回

联手探秘:Promise.all 和 Promise.race 的合璧之舞,共同追寻异步的脚步

前端

踏入异步并发的世界,Promise.all 和 Promise.race 携手同行

在异步编程中,我们经常需要处理多个异步任务。为了简化异步编程,JavaScript 引入了 Promise 对象,提供了一种更优雅的方式来处理异步任务。Promise.all 和 Promise.race 是两个常用的 Promise 方法,它们可以帮助我们同时处理多个异步任务。

Promise.all 方法的作用是,当所有传入的 Promise 实例都被成功解析后,它才会返回一个已完成状态的 Promise 实例,并包含所有传入 Promise 实例解析结果的数组。这意味着,只有当所有异步任务都完成后,Promise.all 才会执行。

Promise.race 方法的作用是,当传入的 Promise 实例中的任何一个被成功解析或拒绝后,它就会返回一个已完成状态的 Promise 实例,并包含第一个被解析或拒绝的 Promise 实例的结果。这意味着,只要有一个异步任务完成后,Promise.race 就会执行。

两者各有千秋,Promise.all适用于所有任务都必须完成的场景,而Promise.race适用于只要有一个任务完成后即可的场景。

我们来看看如何使用Promise.all和Promise.race:

Promise.all([
  fetch('data.json'),
  fetch('image.png')
]).then((results) => {
  // 所有任务完成后执行此代码
  const data = results[0].json();
  const image = results[1].blob();
}).catch((error) => {
  // 只要有一个任务出错就执行此代码
  console.error(error);
});

在这个例子中,我们同时发送了两个异步请求,分别是获取JSON数据和获取图像。当这两个请求都完成后,Promise.all会返回一个包含这两个结果的数组。

Promise.race([
  fetch('data.json'),
  fetch('image.png')
]).then((result) => {
  // 第一个任务完成后执行此代码
  const data = result.json();
  const image = result.blob();
}).catch((error) => {
  // 只要有一个任务出错就执行此代码
  console.error(error);
});

在这个例子中,我们同时发送了两个异步请求,分别是获取JSON数据和获取图像。只要这两个请求中的任何一个完成后,Promise.race就会返回第一个完成的结果。

了解了Promise.all和Promise.race的基本用法,我们就可以着手创建自定义函数,结合这两个方法的优点,实现异步并发的同时顺序执行任务。

function myAsyncFunc(tasks) {
  const promises = tasks.map((task) => task());

  return Promise.all(promises).then((results) => {
    return results.reduce((acc, result, index) => {
      acc[tasks[index].name] = result;
      return acc;
    }, {});
  });
}

这个函数接受一个任务数组作为参数,每个任务都应该是一个返回 Promise 的函数。函数内部将任务映射为 Promise 实例数组,然后使用 Promise.all 方法同时执行所有任务。当所有任务完成后,函数将使用 reduce 方法将任务结果按顺序组合成一个对象,并返回这个对象。

使用这个函数,我们可以实现异步并发的同时顺序执行任务:

myAsyncFunc([
  () => fetch('data.json'),
  () => fetch('image.png')
]).then((results) => {
  // 所有任务完成后执行此代码
  console.log(results);
});

在这个例子中,我们同时发送了两个异步请求,分别是获取JSON数据和获取图像。当这两个请求都完成后,myAsyncFunc会返回一个包含这两个结果的对象。

结语

Promise.all 和 Promise.race 是两个常用的 Promise 方法,它们可以帮助我们同时处理多个异步任务。本文介绍了如何使用这两个方法,以及如何创建自定义函数,结合这两个方法的优点,实现异步并发的同时顺序执行任务。希望本文能帮助您更好地理解和使用 Promise 对象,并为您的异步编程之旅提供帮助。