JavaScript Promise.all()方法与Promise.allSettled()方法的区别是什么
在本文中,我们首先简要了解Promise.all()和Promise.allSettled()方法,然后通过一些理论和编码示例来解释它们之间的区别。
Promise.all()方法和Promise.allSettled()方法都是Promise对象的方法(Promise对象是用于处理所有异步操作的JavaScript对象),用于同时处理多个promise的结果。
Promise.all()方法: 该方法在接收到一个或多个promise作为输入后,返回一个单一的promise。当所有输入中的promise都满足时,返回的promise将被履行。如果输入中的任何一个promise被拒绝,它将使用第一个拒绝的原因来拒绝一个promise。
语法: 可以使用以下语法来声明此方法。
Promise.all([promise_1 , promise_2, ...]).then(
// do something...
)
Promise.allSettled() 方法: 方法接受一个或多个 promises 作为输入,并在所有输入的 promise 已经被解决(包括空迭代器)的情况下,返回一个单一的 promise,此 promise 被履行并返回一个包含每个 promise 结果描述的对象数组。
语法 : 可以使用以下语法声明此方法。
Promise.allSettled([promise_1 , promise_2, ...]).then(
// do something...
)
现在在分析它们的语法之后,是时候看一下它们实际上如何有所不同了。
它们如何有所不同?
以下是一些最重要的要点,将帮助我们了解它们的差异(并通过一些编码示例进行说明):
在拒绝承诺方面:
- Promise.all() 方法在数组中传入的任何承诺输入被拒绝时会拒绝自身。也就是说,只有在所有承诺被成功实现或解决的情况下,此方法才会运行,否则在输出中会产生错误消息。
- Promise.allSettled() 方法不会在数组中传入的任何承诺输入被拒绝时拒绝自身。也就是说,无论承诺如何,它都会处于拒绝状态。
在输出方面:
-
Promise.all() 方法返回一个包含在多个索引中包含承诺数据的数组作为输出。
- Promise.allSettled() 方法返回一个包含对象的数组,而每个对象进一步包含两个属性status和value。
以下是一些编码示例,以更好地理解上述说明的事实:
示例1: 在这个示例中,我们将创建两个成功解决的承诺,然后将它们传递给这两种方法,并将可视化它们的结果。
代码块
输出:
['Resolved First after 1 second','Resolved First after 2 seconds']
[
{ status: 'fulfilled', value: 'Resolved First after 1 second' },
{ status: 'fulfilled', value: 'Resolved First after 2 seconds' }
]
示例2: 在这个示例中,我们将在这两种方法中传递一个被拒绝的承诺,并进一步可视化它们的输出。
Javascript
let rejected_promise = new Promise((resolve,
reject) => reject("Rejected Promise...."));
let first_promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Resolved First after 1 second");
}, 1000);
});
let second_promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Resolved First after 2 seconds");
}, 2000);
});
try {
let result_1 = Promise.all([rejected_promise,
first_promise, second_promise]);
result_1.then((data) => console.log(data));
let result_2 = Promise.allSettled([
rejected_promise,
first_promise,
second_promise,
]);
result_2.then((data) => console.log(data));
} catch (error) {
console.log(error);
};
输出:
(node:10372) UnhandledPromiseRejectionWarning: Rejected Promise….
(Use `node –trace-warnings …` to show where the warning was created)
(node:10372) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
This error originated either by throwing inside of an async function without a catch block,
or by rejecting a promise which was not handled with .catch(). To terminate the node process
on unhandled promise rejection, use the CLI flag `–unhandled-rejections=strict`
see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:10372) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated.
In the future, promise rejections that are not handled will terminate the Node.js process
with a non-zero exit code.
[
{ status: ‘rejected’, reason: ‘Rejected Promise….’ },
{ status: ‘fulfilled’, value: ‘Resolved First after 1 second’ },
{ status: ‘fulfilled’, value: ‘Resolved First after 2 seconds’ }
]
极客教程