使用 Promise.all 的时候需要注意什么?

阅读时长 4 分钟读完

在前端开发中,异步操作很常见,而 Promise 是一种异步编程的解决方案之一,而 Promise.all 则可以在多个 Promise 都完成之后再执行某些操作,这个函数在编写代码时很常用,但是我们在使用 Promise.all 的时候还需要注意以下问题。

必须要提供 Promise 数组

使用 Promise.all 的前提是必须要提供 Promise 数组,如果没有 Promise 数组,则会抛出错误。Promise.all 方法会接收一个 Promise 对象组成的数组,然后返回一个新的 Promise 对象。当 Promise 数组中的所有 Promise 都成功(即 resolve),新的 Promise 的状态就会变成 fulfilled;当任何一个 Promise 失败(即 reject),新的 Promise 的状态就会变成 rejected。

示例代码:

Promise.all 是基于所有 Promise 的状态来决定自己的状态的

我们需要明确,Promise.all 是一个等待所有 Promise 执行完毕之后才会结束的方法,在等待的过程中,它会一直等待直到所有的 Promise 都完成(不论成功还是失败)。在所有 Promise 都成功的前提下,Promise.all 才会返回成功(resolve),并携带所有 Promise 的返回值数组;只有有一个 Promise 失败(reject),才会返回失败,并携带失败的 Promise 错误信息。

示例代码:

在上面的代码中,因为 Promise.reject("Error") 抛出了一个错误,所以 Promise.all 设置的 Promise 对象也会抛出这个错误,导致整个 Promise.all 函数的返回结果是错误。

即使 Promise.all 抛出错误,Promise.all 的其它 Promise 仍会执行完毕

因为 Promise.all 接受的所有 Promise 都是并行执行的,所以即使在这些 Promise 中有一个抛出错误,Promise.all 的其它 Promise 仍然会继续执行。这意味着我们可以通过在返回结果之前添加 catch() 来获取到错误。

示例代码:

在上面的代码中我们通过添加 catch() 来获取到出错的信息,但是需要注意:如果出错的信息中只给出了一个错误(错误信息只给出了一个 Promise 的错误),那么我们将无法准确地知道是哪个操作出现了问题。

Promise.all 没有超时限制

Promise.all 没有超时限制,如果在等待期间,其中一个 Promise 长时间未完成,Promise.all 将会一直等待。如果你需要加入超时控制,可以使用 Promise.race 来实现。

示例代码:

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

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

在上面的代码中,我们通过 Promise.race 来限制了 task1() 的超时时间,如果 task1() 操作超时,就会返回一个错误信息。

结论

在使用 Promise.all 方法时我们需要注意以下几点:

  1. 必须要提供 Promise 数组;
  2. Promise.all 是基于所有 Promise 的状态来决定自己的状态的;
  3. 即使 Promise.all 抛出错误,Promise.all 的其它 Promise 仍会执行完毕;
  4. Promise.all 没有超时限制;
  5. 添加超时控制可以使用 Promise.race 来实现。

我们在学习 Promise.all 时需要注意以上问题,在代码实现中需要灵活运用 Promise,以达到高效、稳定的代码效果。

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

纠错
反馈