在前端开发中,我们常常会遇到需要同时发出多个异步请求的场景。同时,在这些异步请求完成后,我们通常还需要对所有请求的状态进行一些处理,例如判断是否全部成功,或者只有一部分失败等。
ES6 引入了 Promise 对象,让我们能够更优雅地处理异步请求。但是,当我们需要处理多个 Promise 状态时,遇到的问题就是状态个数问题。例如,如果同时发起 5 个异步请求,我们可能会需要知道这 5 个请求最终的状态。
在 ES11 中,Promise.allSettled() 方法解决了这个问题。下面我们将详细介绍 Promise.allSettled() 方法,并提供一个实际使用场景的示例。
Promise.allSettled()
Promise.allSettled() 方法接收一个 Promise iterable 对象,并返回一个 Promise,这个 Promise 在所有给定的 Promise 都已经 fulfilled 或 rejected 时,改变自身状态。该方法接受的 Promise iterable 可以包含原始 Promise 对象、Promise 返回的值或者不是 Promise 的任何其他对象。
与 Promise.all() 方法的不同之处在于,即使 iterable 中的某个 Promise 被拒绝或抛出异常,该方法仍然会返回一组 Promise 状态信息,而不是抛出错误。
Promise.allSettled() 方法返回的 Promise 对象将包含一个数组,数组中的每个元素都是一个对象,该对象代表 iterable 中的一个 Promise。数组中的对象包含两个属性:status 和 value 或 reason。
status 属性表示 Promise 的状态,它是一个字符串,取值可能是 "fulfilled" 或 "rejected"。
value 或 reason 属性分别表示 Promise 的值(即 Promise 被 fulfilled 时的值)或 Promise 被 rejected 时的原因(即 Promise.reject() 函数调用时传递的值)。
下面是 Promise.allSettled() 的基本语法:
Promise.allSettled(iterable) .then((results) => { console.log(results); });
Promise.allSettled() 的使用场景
一个常见的使用场景是,我们需要向多个 API 发送异步请求,并在所有请求都返回后统计结果。在这个场景中,我们可能会发现,使用 Promise.all() 方法并不能完全满足需求,因为如果其中某个请求被拒绝,该方法将抛出错误。而在开发中,这意味着我们需要在代码中添加大量的错误处理逻辑。
这正是 Promise.allSettled() 方法的出现解决的问题。使用 Promise.allSettled() 方法,我们可以很容易地处理所有请求返回的状态,而无需担心错误处理的问题。
实例演示
下面,我们来看一个具体的演示,以更加深入地理解 Promise.allSettled() 的使用。
假设我们需要向多个 API 发送异步请求,并在所有请求返回后统计所有请求成功的数量。我们可以先定义一个包含多个请求的数组,并用 map() 函数将每个请求转换为一个 Promise 对象。然后,我们只需要使用 Promise.allSettled() 方法,统计所有请求成功的数量即可。
-- -------------------- ---- ------- ----- ---- - --------------- -------------- --------------- ----- -------- - ------------ -- ------------ ---------------------------- --------------- -- - ----- ----- - --------------------- -- ------------- --- -------------------- ----------------- -------------- - ------ -------- --------- ---
在上面的示例代码中,我们首先使用 map() 函数将每个 API 请求转换为一个 Promise 对象,并将这些 Promise 对象存储在一个名为 requests 的数组中。然后,我们调用 Promise.allSettled() 方法,等待所有请求完成之后取得所有请求的状态。
在 Promise.allSettled() 方法返回的结果中,我们遍历所有结果,并使用 filter() 函数过滤出所有成功的请求。最后,我们将成功的请求数量打印到控制台中。
总结
Promise.allSettled() 方法是 ES11 新增的 Promise 方法,它解决了 Promise 状态个数问题,并提供了一个更为稳健的解决方案。通过使用 Promise.allSettled() 方法,我们可以更加优雅地处理多 Promise 状态的问题,同时也能够有效地减少代码量和错误处理逻辑。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e2bb95f6b2d6eab3dff098