JS中Promise用法(简要说明)

2024-08-24 04:04
文章标签 js 用法 说明 promise 简要

本文主要是介绍JS中Promise用法(简要说明),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1、下方自定义名词约定
  • 2、官方流程图
  • 3、构造函数Promise + <状态>fulfilled 用法
    • 代码
    • 图示
  • 4、构造函数Promise + <状态>rejected 用法
    • 代码
    • 图示
  • 5、第3和4结合使用,可以将promise状态settled为2种情况之一
    • 代码
    • 图示(图中if和else都是调用positive不太对,以代码为准)
  • 6、then的用法
    • 代码
    • 图示
    • 7、catch的用法
    • 概括
    • 代码
  • 8、all的用法
    • 概括
    • 代码
  • 9、race() //竞态
    • 概括
    • 代码

1、下方自定义名词约定

  • IIFE:立即执行函数
  • positive: 正向结果接收函数(resolve),异步回调后用这个函数接收数据并改变promise状态
  • data: 正向数据
  • negative: 负向结果接收函数(reject),异步回调后用这个函数接收原因并改变promise状态
  • reason: 负向原因

2、官方流程图

在这里插入图片描述

3、构造函数Promise + <状态>fulfilled 用法

代码

//抽象伪代码例子
new Promise( IIFE(positive, negative){ positive(data) } )
//具体例子
let testP = new Promise(function(positive, negative){setTimeout(()=>{positive("success.");console.log(`延迟执行完毕,用positive设置正向结果,并改变promise的状态`);}, 5000);
});

图示

在这里插入图片描述

4、构造函数Promise + <状态>rejected 用法

代码

//抽象伪代码例子
new Promise( IIFE(positive, negative){ negative(reason) } )
//具体例子
let testFail = new Promise(function(positive, negative){setTimeout(()=>{negative("failure.");console.log(`延迟执行完毕,异步回调后用negative这个函数接收原因并改变promise状态`);}, 5000);
});

图示

在这里插入图片描述

5、第3和4结合使用,可以将promise状态settled为2种情况之一

代码

// 下方的 xxx 每次执行都要用一个新变量接收新的结果
let xxx = new Promise(function(positive, negative){setTimeout(()=>{let rst = Math.floor(Math.random()*100);if(rst%2==0){positive(`偶数=>${rst}`);}else{negative(`奇数=>${rst}`); //注意,下方图示调用错误,总是fulfilled态;以运行这个最新代码为准}}, 5000);
});

图示(图中if和else都是调用positive不太对,以代码为准)

在这里插入图片描述
在这里插入图片描述

6、then的用法

代码

new Promise(function(positive, negative){// setTimeout(()=>{let rst = Math.floor(Math.random()*100);if(rst%2==0){positive(`偶数=>${rst}`);}else{negative(`奇数=>${rst}`);}// }, 0);
})
.then(
(data)=>{console.log(`then的第一个参数函数,接收正向结果=>${data}`);
},
(reason)=>{console.log(`then的第二个参数函数,接收负向原因=>${reason}`);
});

图示

触发对应的处理函数

在这里插入图片描述

7、catch的用法

概括

  1. catch等价于then的第2个处理函数,当then没有第2个处理函数时
  2. catch还等价于try catch,当then第1个处理函数运行出错时

代码

//catch是和promise对象的then函数并行的函数
//catch顾名思义,类似try{}catch(e){},用来捕获异常的(promise的catch能捕获2种情况《1、没有then的第2个函数参数时|||2、then的第1个函数参数运行出错时)》如下)//1、当then函数没有第二个参数(用来处理negative原因的函数),catch能够捕获到并处理【等价于then的第2个函数参数,在then没有第2个参数时】
new Promise((positive, negative)=>{negative("负向原因。")
})
.then((data)=>{ console.log("上面是negative,不会进到这里" + data) }// (reason)=>{ console.log("上面是negative,会进来" + reason + "但是我注释掉了,所以这里没处理到。") }
)
.catch( //控制台输出:   捕获negative原因,并输出:undefined ___ 负向原因。(reason, data)=>{ console.log(`捕获negative原因,并输出:${data} ___ ${reason}`) }
);//1-1、这里拓展下,如果then有第二个参数,即接收negative原因并处理的函数,正常catch是执行不了的【then有第2个参数,catch无效】
new Promise((positive, negative)=>{negative("负向原因。")
})
.then((data)=>{ console.log("上面是negative,不会进到这里" + data) },(reason)=>{ console.log("上面是negative,会进来" + reason + "但是我注释掉了,所以这里没处理到。") }
)
.catch((reason, data)=>{ console.log(`捕获negative原因,并输出:${data} ___ ${reason}`) }
);2、then的第一个函数参数运行出错,能catch到报错使js程序不至于暂停(这就是相当于try catch的能力了)
new Promise((positive, negative)=>{positive("正向数据,进入then的第1个处理函数——————")// negative("负向原因。")
})
.then((data)=>{ console.log(data); //控制台输出:正向数据,进入then的第1个处理函数——————console.log(`特意使用不存在的变量${notExistVariable_willError}`); },(reason)=>{ console.log(reason); }
)
.catch(//控制台输出:then的第1个函数使用了不存在的变量,报错:ReferenceError: notExistVariable_willError is not defined ___ undefined(reason, data)=>{ console.log(`then的第1个函数使用了不存在的变量,报错:${reason} ___ 接收到的数据:${data}`) }
);

8、all的用法

概括

  • all函数的数组参数中的所有的promise都成功执行完毕时触发then的第一个函数参数,只要任意没有成功都触发then的第2个函数参数。

代码

Promise.all([new Promise((positive, negative)=>{positive("成功1"); }),new Promise((positive, negative)=>{positive("成功2"); }),new Promise((positive, negative)=>{positive("成功3"); }),
])
.then((results)=>{ console.log(`成功结果集:${results.join(",")}`) },(reason)=>{ console.log(`毕成功,所以不可能有reason=> ${reason}`); }
);
//控制台输出: 成功结果集:成功1,成功2,成功3

9、race() //竞态

概括

  • race数组参数中的promise都是竞争关系,任意完成(不管是调用positive还是negative),都会执行then,并且后续race数组参数中的剩余promise如果完成了也不再触发then了。

代码

//以下代码总是输出: 成功偶数111=>xx  或者 失败奇数111=>xx , 即:
//					只会在执行race数组参数中的第一个promise后,触发与race同级的then一次。
Promise.race([new Promise((positive, negative)=>{let numIn_100 = Math.floor(Math.random()*100);if(numIn_100%2==0){positive(`成功偶数111=>${numIn_100}`);}else{negative(`失败奇数111=>${numIn_100}`);}}),new Promise((positive, negative)=>{positive("失败2222"); }),new Promise((positive, negative)=>{negative("成功3333"); }),
])
.then((data)=>{ console.log(`positive data:${data}`) },(reason)=>{ console.log(`negative reason=> ${reason}`); }
);

这篇关于JS中Promise用法(简要说明)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101392

相关文章

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Mysql中isnull,ifnull,nullif的用法及语义详解

《Mysql中isnull,ifnull,nullif的用法及语义详解》MySQL中ISNULL判断表达式是否为NULL,IFNULL替换NULL值为指定值,NULLIF在表达式相等时返回NULL,用... 目录mysql中isnull,ifnull,nullif的用法1. ISNULL(expr) → 判

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Maven中的profiles使用及说明

《Maven中的profiles使用及说明》:本文主要介绍Maven中的profiles使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录主要用途定义 Profiles示例:多环境配置激活 Profiles示例:资源过滤示例:依赖管理总结Maven 中的