3 种最强大的 JavaScript Promise 方法

2025-06-07

3 种最强大的 JavaScript Promise 方法

Promise 是一个用于返回延迟计算的对象。大多数延迟计算都是异步操作。返回 Promise 的函数可以附加成功和失败的回调。例如

fetch('url')
.then(successCallback,failureCallback)
.then(...)
.catch(...)
.finally(...)

在本文中,我们将学习 3 种最常用的承诺方法。

1. Promise.all

Promise.all ( iterable )方法返回一个新的 Promise 对象,当所有 Promise 都通过或任何第一个 Promise 被拒绝时,该 Promise 对象即为完成状态。当需要处理多个 Promise 时,此方法非常有用。

想象一下,我们想要制作黑咖啡。我们需要咖啡豆、咖啡伴侣和淡水。我们发送了 3 个请求来收集这些原料。如果一个接一个地发送请求,那么耗时会更长。高效的方法是让这些请求并行,并且能够知道所有请求何时完成。接下来是Promise.all

let collectBeans = fetch('bring me Kopi Luwak');
let collectMates = fetch('French Vanilla');
let collectWater = fetch('fresh tubewell water');

Promise.all([
  collectBeans,
  collectMates,
  collectWater])
  .then(ingredients => console.log('make coffee'),
    ohNoo => console.log('I´m sorry'));

Promise.all将确保所有异步任务都得到解决。如果其中任何一个任务失败,整个流程都会失败。例如,如果collectBeans失败,则Promise.all不会关心其他两个请求。这是Promise.all

const promise1 = Promise.reject('rejected');
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3])
    .then(
        values => console.log(values),
        reason => console.log(reason) // rejected
    );

在这个例子中promise1被拒绝,所以整个链失败了。Promise.all当我们需要等待多个工作但这些工作彼此不依赖时很有用。

2. Promise.allSettled

该方法Promise.allSettled( iterable )也接受一个异步任务数组并返回一个 Promise 对象。无论任务是否被拒绝,该 Promise 都会被解析。这是与Promise.all.failed的唯一区别Promise.all,只要其中一个任务失败,该 Promise 就会被解析。

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));

Promise.allSettled([promise1, promise2]).
    then(results => console.log(result));

/*
[
    {
        status: "fulfilled",
        value: 3
    },{
        status: "rejected",
        reason: 'foo'
    }
]
*/

在这个例子中,我们看到promise2被拒绝了,但是返回的承诺已经通过状态得到解决。

当我们需要等待多个并行异步作业,并且它们都需要被满足(解析/拒绝)时,此方法很有用。此方法对于 REST Api 健康检查很有用。

3. Promise.race

Promise.race (iterable)方法也接受一个异步任务数组并返回一个 Promise 对象。Promise 会在第一个 resolve 或 rejection 发生后立即被 resolve。当传入的任何一个 Promise 被 resolve 或 rejection 时,我们都会立即获得输出。

const promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(value => {
    console.log(value); //two
});
// Output is:
// "two"
// because promise2 is faster

如果其中任何一个被拒绝,输出将是相同的

const promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
    setTimeout(reject, 100, 'two');
});

Promise.race([promise1, promise2]).then(value => {
    console.log(value); // this is never called
}, reason => console.log(reason)); // two

// Output is:
// "two"
// because promise2 is faster

当我们需要等待多个异步任务,但只要其中一个任务成功或被拒绝,我们就会立即返回结果时,这种方法就非常有用。对于彩票公司或经纪公司,我们可以使用此方法。

夏日

感谢阅读,希望你能从本文中有所收获。如有任何疑问,请在评论区留言。

文章来源:https://dev.to/tasnimreza/3-most-powerful-javascript-promise-methods-2g8f
PREV
我作为程序员第一年学到的 5 个教训 1. 让自己被看到
NEXT
首次通过 AWS 考试的技巧!