Promise.all、Promise.race、Promise.allSettled、Promise.any区别

news2024/11/28 23:32:01

1.Promise.all

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.all([p1, p2, p3]);

p的状态由p1,p2,p3 决定,分成两种情况。

(1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--all---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--all---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--all---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    Promise.all([p1, p2, p3]).then((res) => {
        console.log("%cPromise.all执行成功了", "color: green;font-size:22px", res)
    })
    .catch((error) => {
    console.log("%cPromise.all执行失败了", "color: red;font-size:22px",error)
    })

}

或者 

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 1000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 1000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject("p3---执行失败了")
            }, 1000);
        })

    }

    Promise.all([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.all执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
        console.log("%cPromise.all执行失败了", "color: red;font-size:16px",error)
    })

}

 

2.Promise.race

 Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.race([p1, p2, p3]);

上面代码中,只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--race---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--race---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--race---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })

    Promise.race([p1, p2, p3]).then((res) => {
        console.log("%cPromise.race执行成功了", "color: green;font-size:22px", res)
    })
    .catch((error) => {
            console.log("%cPromise.race执行失败了", "color: red;font-size:16px",error)
     })


}

或者

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 10000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 10000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject()
            }, 5000);
        })

    }

    Promise.race([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.race执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
        console.log("%cPromise.race执行失败了", "color: red;font-size:16px",error)
    })

}

3.Promise.allSettled

Promise.allSettled() 方法返回一个在所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise ,并带有一个对象数组,每个对象表示对应的 promise 结果。  

const p = Promise.allSettled([p1, p2, p3]); 
{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--allSettled---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--allSettled---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--allSettled---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })

    Promise.allSettled([p1, p2, p3]).then((res) => {
        console.log("%cPromise.allSettled执行成功了", "color: green;font-size:22px", res)
    })
        .catch((error) => {
            console.log("%cPromise.allSettled执行失败了","color: red;font-size:16px", error)
        })
}

或者

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 10000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 1000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject("p3---失败了")
            }, 6000);
        })
    }

    Promise.allSettled([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.allSettled执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
        console.log("%cPromise.allSettled执行失败了","color: red;font-size:16px", error)
    })

}

 

4.Promise.any

只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。  

Promise.any()Promise.race()方法很像,只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。  

const p = Promise.any([p1, p2, p3]);  
{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--any---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--any---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--any---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })


    Promise.any([p1, p2, p3]).then((res) => {
        console.log("%cPromise.any执行成功了", "color: green;font-size:22px", res)
    })
        .catch((error) => {
            console.log("%cPromise.any执行失败了","color: red;font-size:16px", error)
        })

}

或者

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 10000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 6000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject()
            }, 1000);
        })
    }

    Promise.any([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.any执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
            console.log("%cPromise.any执行失败了","color: red;font-size:16px", error)
    })

}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode - 42 接雨水

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 42. 接雨水 - 力扣(LeetCode) 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1 输入&…

金融交易行为监测方法——利用 CNN 模型实现行为识别

背景介绍在证劵交易所领域,曾经发生用户证券账号被盗事件,导致客户资产损失,例如:黑客获得了用户A的证券账号密码,利用多次的低买高卖将资产转移。本文中针对此类对敲欺诈的场景,采用将用户交易数据转换为图…

头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析

文章目录1 MyBatis中Controller层List集合接收数据,泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收?1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据?resultType是集合中的元素的类型,…

论文阅读笔记《GAMnet: Robust Feature Matching via Graph Adversarial-Matching Network》

核心思想 本文提出一种基于图对抗神经网络的图匹配算法(GAMnet),使用图神经网络作为生成器分别生成源图和目标图的节点的特征,并用一个多层感知机作为辨别器来区分两个特征是否来自同一个图,通过对抗训练的办法提高生成器特征提取…

uniCloud基础使用-好文

云函数可以看做java或者php,作为后端服务cloudfunctions/myCloud/index.jsexports.main async (event, context) > {const { name, age } eventreturn 我是${name},今年${age} };pages/index/index.vue//callFunction方法 在前端和云端都可以调用另一个云函数 …

三十而立却被裁,打工人要如何应对职场危机?

又到金三银四就业季,对于部分职场人来说,年龄成为了他们找工作的最大限制。 因为绝大部分企业招聘中层干部以下岗位的时候,都会要求年龄不超过35周岁,再加上每年千万毕业生涌入社会,竞争程度相当激烈,这就导…

QML 模型(ListModel)

LIstModel(列表模型) ListModel 是ListElement定义的简单容器,每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性: count模型中数据条目的数量dynamic动态角色,默认情况下,角色的类型…

Android 进程间通信机制(一) IPC概念和模型

一. 前言 一直想把Binder机制认识清楚, 但是它涉及Android系统的Framework, Native, kernel层, 就需要你要有 C C基础阅读底层源码的能力, 目前笔者的水平,对Binder 在Native 和kernel层的实现原理和机制也是懵逼状态, 真的是博大精深, 故现阶段先把看懂和理解清楚的整理出来…

内核链表分析

内核链表 文章目录内核链表list_head创建链表添加节点1. list_add2. list_add_tail 接口删除节点宿主结构1.找出宿主结构 list_entry(ptr, type, member)2 container_of3. 宿主结构的遍历list_head 在 Linux 内核中,提供了一个用来创建双向循环链表的结构 list_hea…

海康摄像头使用RTSP

1.协议格式。海康威视IP摄像头rtsp协议地址如下:rtsp://[username]:[passwd][ip]:[port]/[codec]/[channel]/[subtype]/av_stream主码流:rtsp://admin:12345192.168.1.64:554/h264/ch1/main/av_streamrtsp://admin:12345192.168.1.64:554/MPEG-4/ch1/mai…

SpringCloud微服务保护

微服务保护微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel1.4.微服务整合Sentinel2.流量控制2.1.簇点链路2.1.…

java基础学习 day51 (匿名内部类)

1. 什么是匿名内部类? 隐藏了名字的内部类,实际名字为:外部类名$序号可以写在成员位置,为没有名字的成员内部类也可以写在局部位置,为没有名字的局部内部类 2. 匿名内部类的格式? new 类名/接口名() { 重…

深入理解AQS

概念设计初衷:该类利用 状态队列 实现了一个同步器,更多的是提供一些模板方法(子类必须重写,不然会抛错)。 设计功能:独占、共享模式两个核心,state、Queue2.1 statesetState、compareAndSetSta…

SpringMVC简单仿写

之前我分享过SpringMVC的基本原理与配置(原文链接:https://blog.csdn.net/L170311/article/details/129339120),为了更深层次的学习,精益求精,手动仿写了一个MVC原理实现demo,一起学习一下吧 结构目录&…

使用预训练模型自动续写文本的四种方法

作者:皮皮雷 来源:投稿 编辑:学姐 这篇文章以中文通用领域文本生成为例,介绍四种常用的模型调用方法。在中文文本生成领域,huggingface上主要有以下比较热门的pytorch-based预训练模型: 本文用到了其中的ue…

RFID在技术在工业产线上的应用

RFID在技术在工业产线上的应用一工业产线需求制造业生产线几乎每月都要损耗大量物料,并且生产结果与预期因为有误差而影响交货的情况时有发生,生产线也往往因人为原因造成种种误差。将RFID标签贴在生产物料或产品上,可自动记录产品的数量、规…

学完Java只能在互联网公司任职吗?

当然不是只有互联网公司需要软件,需要开发技术人员,传统行业、新经济领域都有软件项目需求;Java也不是只能做网站、企业应用,还可以用于嵌入式、游戏…… 互联网时代的手机、智能电视、家具、机械设备等各种有形产品都将会嵌入智…

二、Neo4j源码研究系列 - 单步调试

二、Neo4j源码研究系列 - 单步调试 一、背景介绍 上一篇我们已经把了neo4j的源码准备以及打包流程完成了,本篇将讲解如何对neo4j进行单步调试。对于不了解如何编译打包neo4j的读者,请阅读《一、Neo4j源码研究系列 - 源代码准备》。 大纲: …

【改机教程】iOS系统去除小黑条,改拍照声、拨号音、键盘音,不用越狱,支持所有机型

大家好,上次给大家分享了几个iOS系统免越狱改机教程 今天带来最新的教程,这次修改利用的是同一个漏洞,由外网大神 tamago 开发,国内大神冷风 进行汉化和优化 可以修改的地方包括 去除底部小黑条 dock栏透明 桌面文件夹透明 桌面…

golang 占位符还傻傻分不清?

xdm ,写 C/C 语言的时候有格式控制符,例如 %s , %d , %c , %p 等等 在写 golang 的时候,也是有对应的格式控制符,也叫做占位符,写这个占位符,需要有对应的数据与之对应,不能瞎搞 基本常见常用…