Promise 中的 `all()` 和 `race()` 方法解析

阅读时长 4 分钟读完

Promise 是一种广泛应用于异步编程的技术,它可以优雅地处理异步操作,为我们的代码提供了更简洁的解决方案。在使用 Promise 时,我们最常用到的就是 then()catch() 方法,但它还有一些其他重要的方法,其中就包括 all()race()

all() 方法

Promise.all() 方法可以将多个 Promise 对象合并成一个 Promise 对象,并等待它们全部完成。当所有 Promise 对象都成功时,它返回一个成功结果数组,数组中的每个元素对应了每个 Promise 对象的成功结果;当任意一个 Promise 对象失败时(立即抛出异常),它返回第一个失败 Promise 对象的错误结果。下面是一个例子:

这段代码中,我们创建了三个 Promise 对象:p1p2 分别成功返回了 "hello" 和 "world",而 p3 失败返回了一个包含错误信息的 Error 对象。我们将它们合并到了一个 Promise 对象中,然后使用 then()catch() 方法处理它的结果。

最后我们可以看到,由于 p3 失败了,Promise.all() 函数直接抛出错误,并传递给了 catch() 函数。因此代码会在此模仿并输出 "Error: error"。

race() 方法

Promise.race() 方法也将多个 Promise 对象合并成一个 Promise 对象,但是它的返回结果与所有 Promise 对象中最先结束的那个结果相同。无论是成功还是失败。下面是一个例子:

在这个例子中,我们创建了两个 Promise 对象,它们分别在 1 秒和 2 秒之后分别成功返回了 "hello" 和 "world"。在使用 race() 方法将它们合并后,我们便得到了一个新的 Promise 对象。由于 p1 的执行时间比p2 要快,因此最终的结果是 "hello"。

需要注意的是,当任意一个 Promise 对象失败后,race() 方法会立即返回失败结果(即第一个抛出异常的 Promise 对象的错误结果)。因此,在使用 race() 方法时我们需要非常小心,避免出现无法处理的错误情况。

总结

Promise.all()Promise.race() 方法都可以将多个 Promise 对象合并成一个新的 Promise 对象,它们的作用有所不同。Promise.all() 返回的新对象的结果与所有 Promise 对象成功时传递的结果数组相关,若其中任意一个 Promise 对象抛出异常则会直接返回异常。而 Promise.race() 返回的新对象的结果是最先完成的 Promise 对象的结果,不论它是成功还是失败。

参考

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

纠错
反馈