在 JavaScript 的 ES11 版本中,新增了一个 Promise.allSettled 方法,该方法可以让我们更加方便地处理 Promise 一起执行的情况,本次文章将会详细解析该方法的使用和意义。
Promise.allSettled 方法的作用
Promise.allSettled 方法的作用是将传入的多个 promise 对象进行并行处理,当所有的 promise 对象都被处理完毕后,返回一个 promise 对象,该对象包含了传入的所有 promise 对象的状态和值。
与 Promise.all 方法不同的是,如果有任何一个 promise 对象被拒绝了,Promise.all 方法会立即返回一个拒绝的 promise 对象,并抛出错误,而 Promise.allSettled 方法则会在所有 promise 对象都被处理完毕后,返回一个包含所有 promise 对象状态和值的对象,包括拒绝的 promise 对象。
Promise.allSettled 方法的使用
下面我们来看一下 Promise.allSettled 方法的具体使用。
const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.reject('error'); Promise.allSettled([promise1, promise2, promise3]) .then(results => console.log(results)) .catch(error => console.error(error));
上面的代码中,我们新建了三个 promise 对象,其中 promise3 是被拒绝的。我们将这三个 promise 对象传入 Promise.allSettled 方法中进行处理,然后使用 then 方法获取处理结果。
当我们运行这段代码后,控制台输出如下:
[ { status: 'fulfilled', value: 1 }, { status: 'fulfilled', value: 2 }, { status: 'rejected', reason: 'error' } ]
从输出结果可以看出,Promise.allSettled 方法返回了一个对象数组,数组中包含了所有 promise 对象的状态和值,包括被拒绝的 promise 对象。
Promise.allSettled 方法的指导意义
Promise.allSettled 方法的新增为我们开发者提供了更加便捷的处理多个 promise 对象的方式。我们不需要再去考虑 Promise.all 方法无法返回拒绝的 promise 对象的问题,而是可以更加关注每个 promise 对象的处理结果,从而根据实际情况进行相应的处理。
我们可以根据各个 promise 对象的状态和值进行相应的操作,比如在上面的示例中,我们可以使用 filter 方法来过滤掉状态为“已拒绝”的 promise 对象,然后对状态为“已完成”的 promise 对象进行处理。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------- ----- -------- - ------------------------ ----------------------------- --------- ---------- ------------- -- - ----- ---------------- - --------------------- -- ------------- --- ------------- ------------------------------ -- ------------ -- ----------------------
运行上述代码后,控制台输出结果为:
[ { status: 'fulfilled', value: 1 }, { status: 'fulfilled', value: 2 } ]
可以看出,我们已经成功地过滤掉了状态为“已拒绝”的 promise 对象,然后对状态为“已完成”的 promise 对象进行处理。
总结
在本文中,我们详细地解析了 ES11 中新增的 Promise.allSettled 方法的使用和意义,该方法可以方便地处理多个 promise 对象的状态和值,并且带来了便捷的操作方式,为我们开发者提供了更加便捷的处理 promise 对象的方式。希望本文对大家能够有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64679d46968c7c53b07fad7c