Promise第二篇:你需要记着的API
上一篇介绍了Promise的一些基本用法和串联,这一篇具体讲一下它的API,包括上篇使用的then和catch,以及扩充的静态成员finally和几个静态成员。
目录
1.实例成员
1)then
2)catch
3)finally
2.静态成员
1)resolve(数据)
2)reject(数据)
3)all(iterable):
4)race(iterable)
1.实例成员
1)then
注册一个后续处理函数,当Promise为resolved状态时运行该函数
2)catch
注册一个后续处理函数,当Promise为rejected状态时运行该函数
3)finally
注册一个后续处理函数(无参),当Promise为已解决阶段时运行该函数
即,resolved状态执行then和finally注册的函数,rejected状态执行catch和finally注册的函数,切记,finally注册的函数是不能传递参数的,例子如下:
【例1】
const pro = new Promise((resolve, reject) => {if (Math.random() > 0.5) {resolve(1)} else {reject(2)}
})
pro.then(resp => console.log('then:',resp));
pro.catch(err => console.log('catch:',err));
pro.finally(() => console.log('finally'));
【结果】当事件推向resolve状态时,打印结果如图1-1
当事件推向rejected状态时,打印结果如图1-2
2.静态成员
1)resolve(数据)
该方法返回一个resolved状态的Promise,传递的数据作为状态数据【例2-1】
【注】如果传递的数据是Promise,则直接返回传递的Promise对象【例2-2】
【例2-1】
const pro = Promise.resolve(1);
pro.then(resp => {console.log('resp:',resp);
})
以上代码等价于下列代码
const pro = new Promise((resolve, reject) => {resolve(1);
})
pro.then(resp => {console.log('resp:',resp);
})
【结果】上述两段代码的打印结果均如图1-2-1
2)reject(数据)
该方法返回一个rejected状态的Promise,传递的数据作为状态数据,与resolve()相似,这里就不再举例子了
3)all(iterable):
- 该方法返回一个新的Promise对象,该Promise对象在iterable参数对象里所有的Promise对象都成功的时候触发【例3-1】,一旦有任何一个iterable里面的Promise对象失败则立即触发该Promise对象的失败【例3-2】;
- 这个新的Promise对象在触发成功状态以后,会把一个包含iterable里所有Promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致,这里参考【例3-1】;
- 如果这个新的Promise对象触发了失败状态,它会把iterable里第一个触发失败的Promise对象的错误信息作为它的失败错误信息,这里参考【例3-2】
【注】Promise.all方法常被用于处理多个Promise对象的状态集合。
这里举一个查看班级内所有同学都通过考试的例子,来说明以上三点
【例3】
//在最大值和最小值之间随机产生一个数字
function getRandom(min, max) {return Math.floor(Math.random() * (max - min) + min);
}
//查看该学生的成绩是否合格
function passExam(studentId, grade) {return new Promise((resolve, reject) => {console.log(`学生${studentId}开始查成绩`);setTimeout(() => {if (grade <= 100 && grade >= 60) {console.log(`学生${studentId}通过了考试`);resolve(true);} else if (grade < 60 && grade >= 0) {console.log(`学生${studentId}没有通过考试`);resolve(false);} else {reject(`学生${studentId}成绩有误`)}}, getRandom(1000, 3000));})
}
//查看该班级所有学生的成绩是否均合格
function ifAllStudentsPassExam(gradeList) {const proms = []; //记录所有学生的查成绩结果let passNum = 0; //通过考试的人数let unPass = 0; //没有通过考试的人数for (let i = 0; i < gradeList.length; i++) {const pro = passExam(i + 1, gradeList[i]).then(resp => {if (resp) {passNum++;console.log(`${passNum}名学生通过`);} else {unPass++;console.log(`${unPass}名学生没有通过`)}return resp;}, err => {throw err;})proms.push(pro);}Promise.all(proms).then(results => {console.log(`日志记录:${results}`)})
}
【例3-1】当该班级中所有同学的成绩都是有效成绩,即成绩值处在[0,100]内时,proms中所有对象都成功触发,代码如下
const gradeArr = [100, 99, 45]; //学生的成绩
ifAllStudentsPassExam(gradeArr);
【结果】当proms中所有对象都成功触发时,Promise.al(proms)到resolved状态,执行thenable函数
【例3-2】当班级中学生的成绩有无效成绩时,代码如下
const gradeArr = [100, 99, 101]; //学生的成绩
ifAllStudentsPassExam(gradeArr);
【结果】
4)race(iterable)
当iterable参数里的任意一个子Promise被成功或失败后,父Promise马上也会用子Promise的成功返回值或失败详情作为参数调用父Promise绑定的相应句柄,并返回该Promise对象【例4】
【例4】
function getRandom(min, max) {return Math.floor(Math.random() * (max - min)) + min;
}
const proms = [];
for (let i = 0; i < 10; i++) {proms.push(new Promise((resolve, reject) => {setTimeout(() => {if (Math.random() > 0.5) {console.log(i, '完成');resolve(i);} else {console.log(i, '失败');reject(i);}}, getRandom(1000, 3000));}))
}
const pro = Promise.race(proms);
pro.then(datas=> {console.log('有人完成了',datas);
})
pro.catch(err=>{console.log('有人失败了',err)
})
console.log(proms);
console.log(pro);
【结果】当有人先完成了,打印结果如下
当有人先失败了,打印结果如下
Promise第二篇:你需要记着的API相关推荐
- Jquery第二篇【选择器、DOM相关API、事件API】
tags: Jquery 前言 前面已经介绍过了Jquery这门语言,其实就是一个javaScript的库...能够简化我们书写的代码....本博文主要讲解使用Jquery定位HTML控件[定位控件就 ...
- AVB简介--第二篇:gPTP简介
转自:AVB简介--第二篇:gPTP简介 本文是AVB系列文章的第二篇,主要介绍AVB协议族中的精确时钟同步协议gPTP(IEEE Std 802.1AS-2011). 一.时间同步要解决的问题 不知 ...
- 2020年博客日报第二篇|总有些人影响着你,反思+工作总结
博客日报篇章二 触发心灵的东西才能不断激励自我提升 (想起了领导对于日报的强调,一定要对于今天的感悟,不是"流水账") 一.开篇前言 昨天晚上规划了今天的工作任务,目标狠明确,狠明 ...
- 第二篇:C/C++语法踩过的坑
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.C++内置库支持[库->API] 1.内置库和API函数的 ...
- 【论文写作】-我的第一篇论文形成记(投稿过程、课题来源、python与数学学习、实验设计、论文思路建立与写作、回复审稿人)
我的第一篇论文形成记 投稿过程 背景记录 课题来源-本科毕业设计 python及数学学习 实验设计 调参阶段 实验阶段 论文思路建立 论文写作 回复审稿人 总结 投稿过程 2022年12月28日 投A ...
- UWB定位: 第二篇 . 原理
UWB定位系列专题: UWB定位: 第一篇 . 简介 UWB定位: 第二篇 . 原理 UWB定位: 第三篇 . 市场分析 UWB定位: 第四篇 . Apple Iphone11 U1芯片 & ...
- 战地日记 第二篇 一月总结及一些感想
战地日记 第二篇 一月总结及一些感想 时间过得既慢又快,转眼已经是12月3日了,来兄弟连已经一个多月了,今天刚上完了day28的课,Java基础部分也才考过了,也该总结一下这段时间的学习了. Java ...
- 黎想深度访谈腾讯顶级产品经理的进阶之路——第二篇《定位》
16个月精心打磨,9位顶级产品专家研讨提炼,凝聚腾讯产品经验的八集八分钟产品课分别从用户.定位.需求.时机.匠心.危机.合作.商业角度出发,还原产品背后的故事,分享给你腾讯产品的心法.艺形艺意工作室创 ...
- 焱老师带你学习MYSQL系列 第二篇 (MYSQL 数据结构)
相关系列链接 焱老师带你学习MYSQL系列 第六篇 (MYSQL是如何实现锁的) 焱老师带你学习MYSQL系列 第五篇 (MYSQL事务隔离级别是如何实现的) 焱老师带你学习MYSQL系列 第四篇 ( ...
最新文章
- Java - HtmlEmail 邮件发送
- 数字加字符串用,隔开
- Matlab向量与多项式
- 到底逾期几次才会影响贷款申请?
- java中大量匿名内部类的坏处_java中的匿名内部类总结
- 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
- AIX 与Linux 中crontab 介绍
- 计算机主页为什么打不开怎么办,主页被限制,打不开怎么办?
- git指定版本openwrt源码_关于Github Action自动编译Lean_Openwrt的配置修改问题
- android studio for android learning (十四) android的数据的存储sharedPreferences
- 浅析汽车芯片信息安全之安全启动
- 花一周时间整理了3.5W字的全栈自动化测试面试题(答案+学习路线)!为了找到好工作,拼了!
- 五行代码实现MD5加密(超级简单,一看就会)
- 第4章-一阶多智体系统一致性 -> 连续时间系统一致性
- 【转】完美解决iphone连电脑蓝牙出现bluetooth外围设备无法正确安装
- DCDC相关故障分析记录
- Python读取PDF文档(或TXT)
- AlphaGo Model-Based RL
- sql安装出错,安装程序配置服务器失败的解决方案 [转]
- Java计算1到100阶乘和