JavaScript中promise.all和promise.race的区别详解

 更新时间:2024年09月24日 09:37:46   作者:肖肖肖丽珠  
Promise.all和Promise.race是JavaScript的两种Promise处理方法,Promise.all要求所有Promise对象成功完成才返回成功,若有一个失败则整体失败,Promise.race返回第一个完成的Promise结果,需要的朋友可以参考下

前言

Promise.all和Promise.race是JavaScript中Promise API的两个重要方法,它们在处理多个Promise对象时表现出不同的行为。以下是它们之间的主要区别:

1. 功能和行为

Promise.all:

功能:接收一个包含多个Promise的数组(或类数组对象)作为参数,并返回一个新的Promise。

行为:只有当数组中的所有Promise对象都成功完成时(即状态都变为fulfilled),返回的Promise对象才会成功完成,并将所有Promise的结果作为一个数组返回。如果数组中的任何一个Promise对象失败(即状态变为rejected),则返回的Promise对象会立即失败,并将第一个失败的Promise的原因作为失败原因返回。

使用场景:适用于需要等待所有异步操作都成功完成后再进行下一步操作的场景,如同时加载多个资源并在所有资源都加载完成后显示页面。

Promise.race:

功能:同样接收一个包含多个Promise的数组(或类数组对象)作为参数,并返回一个新的Promise。

行为:这个返回的Promise会在数组中的任意一个Promise状态变为fulfilled或rejected时被解决或拒绝,且以第一个被解决的Promise的结果(或原因)作为其结果返回。如果数组中的所有Promise都被拒绝,则返回的Promise将会以最先被拒绝的Promise的原因作为其原因拒绝。

使用场景:适用于设置超时机制或只关心第一个完成的异步操作的场景,如发起一个请求并设置一个超时时间,如果请求在超时时间内完成,则返回请求结果;如果超时,则返回超时错误。

2. 返回值和状态

Promise.all:返回一个新的Promise,其状态取决于所有传入的Promise对象的状态。如果所有Promise都成功完成,则新Promise也成功完成,并返回所有结果的数组;如果有任何一个Promise失败,则新Promise也失败,并返回第一个失败的原因。

Promise.race:同样返回一个新的Promise,但其状态仅由第一个解决的Promise决定。无论第一个解决的Promise是成功还是失败,新Promise的状态都会与其保持一致,并返回相应的结果或原因。

3. 示例

Promise.all示例:

const promise1 = Promise.resolve(3);  
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));  
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 50, 'bar'));  
 
Promise.all([promise1, promise2, promise3]).then((values) => {  
  console.log(values); // [3, 'foo', 'bar']  

});

Promise.race示例:

javascript

const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'one'));  
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'two'));  
 
Promise.race([promise1, promise2]).then((value) => {  
  console.log(value); // "two"  

    });

总结

Promise.all和Promise.race在处理多个Promise对象时提供了不同的机制。Promise.all适用于需要等待所有异步操作都成功完成的场景,而Promise.race则适用于只关心第一个完成的异步操作的场景。了解它们之间的区别对于在JavaScript中编写高效、可靠的异步代码至关重要。

相关文章

  • json对象和formData相互转换的方式详解

    json对象和formData相互转换的方式详解

    我们有两种常见的传参方式: JSON 对象格式和 formData 格式,但是一些场景是需要我们对这两种数据格式进行转换的,这篇文章主要介绍了json对象和formData相互转换的方式详解,需要的朋友可以参考下
    2023-02-02
  • JSON字符串操作移除空串更改key/value的介绍

    JSON字符串操作移除空串更改key/value的介绍

    今天小编就为大家分享一篇关于JSON字符串操作移除空串更改key/value的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • JS结合WebSocket实现实时双向通信

    JS结合WebSocket实现实时双向通信

    WebSocket 是一种在 Web 应用程序中实现实时、双向通信的协议,在本文中,我们将深入介绍 WebSocket 的原理、用法以及一些实际应用场景,x需要的可以参考下
    2023-11-11
  • 简述JS中forEach()、map()、every()、some()和filter()的用法

    简述JS中forEach()、map()、every()、some()和filter()的用法

    JS中常常需要对数组进行遍历、迭代操作,而我们常用的就是for语句对数组进行迭代,下面这篇文章主要给大家介绍了关于JS中forEach()、map()、every()、some()和filter()的用法,需要的朋友可以参考下
    2022-05-05
  • JS简单设置下拉选择框默认值的方法

    JS简单设置下拉选择框默认值的方法

    这篇文章主要介绍了JS简单设置下拉选择框默认值的方法,涉及javascript针对页面元素的遍历、查找及设置技巧,需要的朋友可以参考下
    2016-08-08
  • three.js创造时空裂缝特效实现示例

    three.js创造时空裂缝特效实现示例

    这篇文章主要为大家介绍了three.js创造时空裂缝特效实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • js仿京东放大镜

    js仿京东放大镜

    这篇文章主要为大家详细介绍了js仿京东放大镜,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • ES6新特性之Symbol类型用法分析

    ES6新特性之Symbol类型用法分析

    这篇文章主要介绍了ES6新特性之Symbol类型用法,结合形式分析了Symbol类型的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-03-03
  • layui输入框只允许输入中文且判断长度的例子

    layui输入框只允许输入中文且判断长度的例子

    今天小编就为大家分享一篇layui输入框只允许输入中文且判断长度的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • javascript中利用数组实现的循环队列代码

    javascript中利用数组实现的循环队列代码

    javascript中利用数组实现的循环队列代码,需要的朋友可以参考下。
    2010-01-01

最新评论