最新的 ECMAScript 2020 (ES11)中,引入一个新的 Promise.allSettled() 方法,这个方法允许我们一次性处理多个 Promise 对象的执行结果,无论成功或者失败。在本文中,我们将详细介绍这个新方法的用法和语法,并同时给出一些实际代码示例。
语法
Promise.allSettled() 方法接受一个 Promise 数组作为参数,返回一个新的 Promise 对象。这个新的 Promise 对象的完成状态和原来的 Promise 对象数组的状态有关,具体表现为以下几种情况:
- 当所有的 Promise 对象都成功完成时,这个新的 Promise 对象也成功完成,并返回一个结果数组,这个结果数组中的每一个元素代表对应原来的 Promise 对象的成功执行结果。
- 当所有的 Promise 对象都已经完成(即无论成功或者失败)时,这个新的 Promise 对象也完成,并返回一个结果数组,这个结果数组中的每一个元素代表对应原来的 Promise 对象的执行结果,无论成功或失败。
- 当所有的 Promise 对象中至少有一个失败时,这个新生成的 Promise 对象也失败,并返回一个错误数组,这个错误数组中的每一个元素代表对应原来的 Promise 对象的错误信息。
下面是 Promise.allSettled() 方法的语法:
Promise.allSettled(iterable);
其中,iterable
表示一个可以迭代的对象,比如数组和字符串等。
实例
下面我们来看看 Promise.allSettled() 方法的实际使用案例。
成功情况
在下面的示例中,我们创建了两个 Promise 对象,这两个 Promise 对象都是在指定时间后才成功完成,然后我们使用 Promise.allSettled() 方法将它们合并到一个 Promise 对象里:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - --- ------------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - --- ------------- -- ------ --- ----------------------------- ------------------------- -- - --------------------- ---
在上面的代码中,由于我们分别在 3 秒和 5 秒之后,才让两个 Promise 对象成功完成,所以通过 Promise.allSettled() 方法返回的结果数组中,每一个元素的状态都是 "fulfilled",并且每一个 Promise 对象的成功结果也都能够得到返回。在运行上面的代码后,控制台输出如下:
[ { status: 'fulfilled', value: 'Promise 1 has succeeded!' }, { status: 'fulfilled', value: 'Promise 2 has succeeded!' } ]
混合情况
我们再来看看一个更加复杂的例子。在下面的代码中,我们创建了三个 Promise 对象,分别表示了成功、失败和延迟执行的任务,然后我们将这三个 Promise 对象用 Promise.allSettled() 方法合并成一个新的 Promise 对象,并最终输出这个新 Promise 对象在完成后返回的状态。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------ ------------ ------------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - --- ------------- -- ------ --- ----------------------------- --------- ------------------------- -- - --------------------- ---
在运行上面的代码之后,我们会看到如下输出,这个输出展示了在这个新的 Promise 对象中,每一个元素代表对应原来的 Promise 对象的执行结果:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', reason: Error: Error occurred! at <anonymous>:3:38 }, { status: 'fulfilled', value: 'Promise 3 has succeeded!' } ]
在上面的输出中,第一个元素代表的是成功的任务,返回的值为 1;第二个元素代表的是失败的任务,打印出来的是一个错误消息;第三个元素代表的是延迟执行的任务,成功完成后返回了一个字符串结果。
错误处理
除了 Promise.all() 方法和 Promise.race() 方法之外,ES6 中的 Promise 并没有提供一种清晰地处理 Promise 数组中的错误信息的方式。在这种情况下,我们通常需要使用 Promise.all() 配合 catch() 方法等方式来捕捉 Promise 数组中的错误信息。
但是,现在有了 Promise.allSettled() 方法,我们就能够更加方便地处理这些错误信息了。事实上,我们只需要在 Promise.allSettled() 方法的返回结果中,遍历所有状态为 rejected 的元素,然后即可获取到它们各自的错误信息。例如:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - --- ------------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- ------------ --------- ---- ---------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - --- ------------- -- ------ --- ----------------------------- --------- ------------------------- -- - ----- ------ - --- ------------------------ -- - -- -------------- --- ----------- - --------------------------- - --- ------------------- ---
在上面的代码中,我们在第二个 Promise 对象中添加了一个 reject() 方法,以模拟它的失败情况。然后,我们在 Promise.allSettled() 方法的处理回调函数中,遍历每一个返回的结果对象,在状态为 rejected 的情况下,将错误信息 push 到一个称为 errors 的数组里面。最后,我们通过 console.log 来打印出这个 errors 数组,输出它的结果为一个 Error 对象。
总结
在本文中,我们介绍了 ES11 中的 Promise.allSettled() 方法,这个方法允许我们一次性处理多个 Promise 对象的执行结果,无论成功或者失败。我们从语法、使用案例和错误处理三个方面对这个新方法进行了详细的剖析,并给出了多个实际的代码示例。如果你想更好地使用 Promise 对象来处理异步任务,那么 Promise.allSettled() 方法一定是一个不可或缺的工具。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b3546748841e9894f985b2