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