第17天:承诺处决
#javascript #100daysofcode #day17

- 并行执行

并行执行是同时运行多个异步任务的过程,利用JavaScript的非阻滞性质来提高性能。

Promise.all([
  Promise.resolve('Success 1'),
  Promise.resolve('Success 2'),
])
.then((result) => {
  console.log(result); // ['Success 1', 'Success 2']
})

Promise.all()方法将一系列承诺作为输入,并返回一个新的承诺,当数组中的所有承诺都解决时,可以通过一系列结果解决。

ð序列执行

我们可能需要按照特定顺序执行多个异步任务,其中一个任务的结果取决于上一个任务的结果。可以将承诺束缚在一起以处理异步操作的顺序执行。

promise1
.then((result1) => {
  console.log('result from 1 api', result1)
  return promise2;
})
.then((result2) => {
  console.log('result from 2 api', result2);
});

- 首先实现的诺言

有时,您可能需要在实现几个诺言之一的一项。

Promise.race([
  Promise.reject('Error 1'),
  Promise.resolve('Success 1'),
  Promise.reject('Error 2'),
]).then((result) => {
  console.log(result); // won't reach
})
.catch((error) => {
  console.error(error); // Error 1
});

Promise.race()解决或拒绝第一个解决或拒绝承诺的价值或原因。

ð首次成功执行

我们可能需要等待一系列承诺的第一个解决承诺。

const promises = [
  Promise.reject('Error 1'),
  Promise.resolve('Success 1'),
  Promise.reject('Error 2'),
];

Promise.any(promises)
.then((result) => {
  console.log(result); // "Success 1"
})
.catch((error) => {
  console.error(error); // AggregateError: All Promises were rejected
});

Promise.any()函数可以根据第一个解决的承诺结果解决,忽略了任何拒绝。这样,我们确保链条以第一个解决的承诺的结果继续。

所有状态

我们可能需要执行多个承诺,无论其个人结果如何

const promises = [
  Promise.resolve('Success 1'),
  Promise.reject('Error 1'),
  Promise.resolve('Success 2'),
];

Promise.allSettled(promises)
.then((results) => {
  console.log(results);
  /*
  [
    { status: "fulfilled", value: "Success 1" },
    { status: "rejected", reason: "Error 1" },
    { status: "fulfilled", value: "Success 2" },
  ]
  */
});

Promise.allSettled()方法返回一个承诺,该承诺用代表每个输入承诺状态的对象来解决。