在 ECMAScript 2020 中,我们迎来了一个新的 Promise 方法,它就是 Promise.allSettled()
。这个方法提供了一种更加灵活的方式,来处理 Promise 数组中的多个 Promise 对象。
概述
在之前的 Promise 版本中,我们常使用 Promise.all() 方法来处理 Promise 数组。这个方法会返回一个 Promise 对象,当所有的 Promise 对象都成功时,它才会进行状态的改变。如果其中一个 Promise 对象失败了,那么整个 Promise 数组的状态就会变为失败状态。
然而,在某些场景下,我们并不要求一定要所有的 Promise 对象都成功,同时也不想因为某个 Promise 对象失败而导致整个 Promise 数组的状态变为失败状态。这时,我们可以使用 Promise.allSettled()
方法。
Promise.allSettled()
方法会返回一个 Promise 对象,这个 Promise 对象的状态会在所有 Promise 对象都完成后被改变。如果所有 Promise 对象都成功,则状态为 fulfilled;如果存在任何一个 Promise 对象失败,则状态为 rejected。此时,Promise.allSettled() 返回的对象中,每个 Promise 对象都有一个状态和一个值,以表示它是成功还是失败。
示例代码
下面是一个具体的示例代码,以展示 Promise.allSettled()
方法的使用方法:
-- -------------------- ---- ------- ----- -------- - - ------------------------ - -- ------------- ----------------------- - -- ------------ ------------------------ - -- ------------ -- ------------------------------------------- -- - --------------------- ---
上述代码中,我们创建了一个包含三个 Promise 对象的数组 promises
。其中,Promise 1 和 Promise 3 是成功状态,Promise 2 是失败状态。我们将这个数组传入 Promise.allSettled()
方法中,并且在方法返回的 Promise 对象的 then() 方法中,打印了 results 数组的值。
在控制台中,我们可以看到 results
数组的内容如下:
[ { status: "fulfilled", value: "Promise 1 is fulfilled." }, { status: "rejected", reason: "Promise 2 is rejected." }, { status: "fulfilled", value: "Promise 3 is fulfilled." } ]
深入理解
在实际项目中,Promise.allSettled()
方法非常实用,特别是当你需要将多个异步操作的结果聚合在一起使用时。在前面提到的例子中,我们创建了一个包含三个 Promise 对象的数组。如果使用 Promise.all()
方法,我们将会得到一个错误信息,因为数组中的某一个 Promise 对象已经失败了。但是使用 Promise.allSettled()
方法,我们仍然可以获取到所有 Promise 对象的状态,这样我们就有了更多的选择。
对于每个 Promise 对象,Promise.allSettled()
方法生成的结果对象中,都会包含一个 status 属性。这个属性的值可能是 "fulfilled" 或 "rejected",分别表示成功和失败。当 Promise 对象状态为 fulfilled 时,结果对象中会有一个 value 属性,其值就是 Promise 对象返回的值;当状态为 rejected 时,结果对象中会有一个 reason 属性,其值就是 Promise 对象的拒因。
总结
在 ECMAScript 2020 中,我们新引入了 Promise.allSettled()
方法,这个方法可以很方便地处理多个 Promise 对象的状态。和 Promise.all()
方法不同,即使其中一个 Promise 对象失败,Promise.allSettled()
仍然会返回所有 Promise 对象的状态信息。因此,我们建议开发人员在实际项目中,根据实际需求选择适当的方法,以避免在处理 Promise 数组时引入不必要的麻烦。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65ae7c41add4f0e0ff806fe2