ES11 中 Promise.allSettled 方法的优化

阅读时长 5 分钟读完

ES11 中 Promise.allSettled 方法的优化

Promise.allSettled() 是一个用于接受多个 Promise 实例并并行执行的静态方法。它的返回值是一个新的 Promise,它的状态由传入的所有 Promise 实例的状态决定。当所有 Promise 实例状态都变化时,allSettled() 返回的 Promise 实例会由 resolve() 方法改变其状态为fulfilled,并丢失了实例返回的值和排查 error 的职责,而是返回一个用于表示所有传入的 Promise 实例可用状态的 包含一个对象数组 Array<object> 的值。

常规用法:

结果输出:

对于处理单个 Promise 时,通常需要使用 Promise.reject() 或 Promise.resolve() 来解析 Promise 实例的状态,从而根据 Promise 返回的状态进行不同的处理。而 Promise.all() 可以同时处理多个 Promise,但只能处理状态位于 fulfilled 的 Promise 对象,无法处理出现 reject 异常的 Promise 对象。对比来看,Promise.allSettled() 不仅可以解决 Promise.all() 的局限性,更为重要的是可以提供更详细的处理信息。

ES11 的新特性进一步完善了 Promise.allSettle() API,引入了优化后的版本。在代码量不大的情况下,使用 forEach 循环的方式处理多个 Promise 是允许的,但个人认为使用 map() 会更为简洁优雅。

优化前:

-- -------------------- ---- -------
----- -------- --------- -
    ----- ---- - -----------------------------------------------
    ----- ---- - -----------------------------------------------
    ----- ---- - -----------------------------------------------

    ----- -------- - --------------------------- -- -----------------
    ----- -------- - --------------------------- -- -----------------
    ----- -------- - --------------------------- -- -----------------

    ----- ------- - ---
    ------------------ ----------
    ------------------ ----------
    ------------------ ----------

    ------ --------
-

------------------------ -- ----------------------

优化后:

-- -------------------- ---- -------
----- -------- --------- -
    ----- ---- - -
        -----------------------------------------------
        -----------------------------------------------
        ----------------------------------------------
    --
    ----- -------- - -------------- -- -------------------------- -- ------------------
    ----- ------- - ----- -----------------------------
    ------ --------
-

------------------------ -- ----------------------

优化后的示例代码使用 map() 进行循环,将 Promise 异步请求与 allSettled() 结合使用。当 Promise 被处理完毕时,allSettled() 将要么返回包含对象数组的成功状态,要么返回对象数组的失败状态。我们可以使用 promise.status 来检查 Promise 是否被成功处理,如果 promise.status 为 fulfilled 则访问对象值 value,否则访问获取失败原因的原因 reason。

优化后的示例代码表明,通过 allSettled 方法的优化,可以更好地处理 Promise 的执行和状态,并且可以通过对象数组进一步优化对各状态的处理。

总结:ES11 引入的 Promise.allSettled() 方法,增强了 Promise 多个实例并行执行时掌握状态的方式,在处理 Promise 时更加高效简洁。在使用 Promise 中,我们也应该深入了解其API特性,以更好地应对项目中不断变化的需求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b6eb5968c7c53b0dc417c

纠错
反馈