JavaScript 中的 Promise.all() 函数

Promise.all() 函数 将一组 Promise 转换为单个 Promise, 实现 当原始数组中的所有,这是一个使用示例 Promise.all() 包装一系列 Promise:

// `p1` is immediately fulfilled with value `1`
const p1 = Promise.resolve(1);
// `p2` will be fulfilled with value `2` after 100ms
const p2 = new Promise(resolve => setTimeout(() => resolve(2), 100));

const pAll = Promise.all([p1, p2]);
pAll instanceof Promise; // true

const arr = await pAll;

Array.isArray(arr); // true
arr[0]; // 1
arr[1]; // 2

异步函数的并行执行

当与 异步函数 Promise.all() 允许您并行执行代码。 传递一个数组 async 函数调用 Promise.all(),JavaScript 将并行执行异步函数,假设你有两个异步函数 getName()getAge(),这是您可以使用的方法 Promise.all() 并行执行它们:

async function getName() {
  await new Promise(resolve => setTimeout(resolve, 200));

  return Jean-Luc Picard;
}

async function getAge() {
  await new Promise(resolve => setTimeout(resolve, 200));

  return 59;
}

const start = Date.now();
const [name, age] = await Promise.all([getName(), getAge()]);
const end = Date.now();

name; // Jean-Luc Picard
age; // 59

end - start; // Approximately 200

错误案例

如果其中一个 Promise 被拒绝,则返回的 Promise Promise.all() 立即以相同的错误拒绝。

const success = new Promise(resolve => setTimeout(() => resolve(OK), 100));
const fail = new Promise((resolve, reject) => {
  setTimeout(() => reject(new Error(Oops)), 100);
});

try {
  await Promise.all([success, fail]);
} catch (err) {
  err.message; // Oops
}

请注意,由于 Promise 不可取消,因此每个单独的 Promise 都会继续执行,即使其中一个错误出错。 如果您传递一组异步函数并且其中一个异步函数抛出错误, Promise.all()将立即拒绝该错误。但其他功能将继续执行。

let finished = false;

const success = async function() {
  await new Promise(resolve => setTimeout(resolve, 100));

  finished = true;
  return OK;
}
const fail = async function() {
  await new Promise(resolve => setTimeout(resolve, 10));
  throw new Error(Oops);
}
try {
  await Promise.all([success(), fail()]);
} catch (err) {
  err.message; // Oops

  // `Promise.all()` fails fast because `fail()` threw an
  // error, but `success()` is still running.
  finished; // false

  // If you wait, `success()` will set `finished`
  await new Promise(resolve => setTimeout(resolve, 100));
  finished; // true
}

Getting Fancy with Generators

Promise.all() 函数不限制您使用数组,第一个参数可以是 任何 JavaScript iterable 。 数组是可迭代的,生成器函数也是如此。 这意味着您可以传入一个产生承诺的生成器,并且 Promise.all() 会将所有产生的 Promise 捆绑到一个 Promise 中。

const generatorFn = function*() {
  for (let i = 1; i <= 5; ++i) {
    yield Promise.resolve(i);
  }
}

const arr = await Promise.all(generatorFn());

arr; // [1, 2, 3, 4, 5]
© 版权声明
THE END
喜欢就支持一下吧
点赞970 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容