ES6 教程:解析 Promise.race 与 Promise.all 的区别

阅读时长 4 分钟读完

ES6 引入了 Promise,是一种处理异步操作的新的标准方式。Promise 提供了方便的 API,可以有效地管理异步代码的执行顺序。在 Promise 中,Promise.race 和 Promise.all 是两个非常常见的方法。在本教程中,我们将解析这两个方法的区别并提供示例代码。

Promise.race

Promise.race 方法接收一个 promise 对象的数组作为参数。当数组中的任意一个 promise 对象完成(包括成功和失败),Promise.race 就会返回一个新的 promise 对象。这个新的 promise 对象的状态和完成值将取决于第一个完成的 promise 对象的状态和完成值。

以下是一个简单的示例代码,其中我们将三个不同的定时器封装在 promise 对象中并传递给 Promise.race。可以看到,结果是只有第一个定时器的结果被打印出来了。

输出结果:

如果 Promise.race 方法中传入的 promise 对象全部都是成功的状态,则第一个完成的 promise 将会决定 Promise.race 的结束状态,即它的返回值将与第一个完成的 promise 的值相同。如果 Promise.race 方法中传入的 promise 对象全部都是失败的状态,则第一个失败的 promise 将会决定 Promise.race 的结束状态,即它的返回值将与第一个失败的 promise 的值相同。

Promise.all

Promise.all 方法也接收一个 promise 对象的数组作为参数。当数组中的所有 promise 对象都完成时(即所有的 promise 对象都成功或至少有一个 promise 对象失败),Promise.all 就会返回一个新的 promise 对象。这个新的 promise 对象的状态和值将取决于所有 promise 对象的状态和值。

以下是一个简单的示例代码,其中我们将三个不同的定时器封装在 promise 对象中并传递给 Promise.all。可以看到,结果是需要等待三个定时器全部结束后,才会将三个 promise 对象的结果一起打印出来。

输出结果:

如果 Promise.all 方法中传入的 promise 对象有至少一个处于失败的状态,则 Promise.all 的返回值将会是第一个失败的 promise 的值。

总结

Promise.race 与 Promise.all 是两个非常常见的方法。简单地说,Promise.race 返回的是第一个完成的 promise 的结果,在其中一个 promise reject 的情况下,不管有没有 promise resolve 完成,最终都是 reject;而 Promise.all 返回的是所有 promise 的结果,当其中一个 promise reject 的情况下,其他 promise 继续执行,但不包括 reject promise 之后的结果。

使用 Promise.race 和 Promise.all 可以在编写异步代码时极大地方便开发者进行控制。使用案例包括轮询服务、同时执行多个异步任务等等。

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

纠错
反馈