上一篇介绍了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

图1-1

当事件推向rejected状态时,打印结果如图1-2

图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-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-1

【例3-2】当班级中学生的成绩有无效成绩时,代码如下

const gradeArr = [100, 99, 101]; //学生的成绩
ifAllStudentsPassExam(gradeArr);

【结果】

图3-2

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);

【结果】当有人先完成了,打印结果如下

图4-1

当有人先失败了,打印结果如下

图4-2

Promise第二篇:你需要记着的API相关推荐

  1. Jquery第二篇【选择器、DOM相关API、事件API】

    tags: Jquery 前言 前面已经介绍过了Jquery这门语言,其实就是一个javaScript的库...能够简化我们书写的代码....本博文主要讲解使用Jquery定位HTML控件[定位控件就 ...

  2. AVB简介--第二篇:gPTP简介

    转自:AVB简介--第二篇:gPTP简介 本文是AVB系列文章的第二篇,主要介绍AVB协议族中的精确时钟同步协议gPTP(IEEE Std 802.1AS-2011). 一.时间同步要解决的问题 不知 ...

  3. 2020年博客日报第二篇|总有些人影响着你,反思+工作总结

    博客日报篇章二 触发心灵的东西才能不断激励自我提升 (想起了领导对于日报的强调,一定要对于今天的感悟,不是"流水账") 一.开篇前言 昨天晚上规划了今天的工作任务,目标狠明确,狠明 ...

  4. 第二篇:C/C++语法踩过的坑

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.C++内置库支持[库->API] 1.内置库和API函数的 ...

  5. 【论文写作】-我的第一篇论文形成记(投稿过程、课题来源、python与数学学习、实验设计、论文思路建立与写作、回复审稿人)

    我的第一篇论文形成记 投稿过程 背景记录 课题来源-本科毕业设计 python及数学学习 实验设计 调参阶段 实验阶段 论文思路建立 论文写作 回复审稿人 总结 投稿过程 2022年12月28日 投A ...

  6. UWB定位: 第二篇 . 原理

    UWB定位系列专题: UWB定位: 第一篇 . 简介 UWB定位: 第二篇 . 原理 UWB定位: 第三篇 . 市场分析 UWB定位: 第四篇 . Apple Iphone11 U1芯片 & ...

  7. 战地日记 第二篇 一月总结及一些感想

    战地日记 第二篇 一月总结及一些感想 时间过得既慢又快,转眼已经是12月3日了,来兄弟连已经一个多月了,今天刚上完了day28的课,Java基础部分也才考过了,也该总结一下这段时间的学习了. Java ...

  8. 黎想深度访谈腾讯顶级产品经理的进阶之路——第二篇《定位》

    16个月精心打磨,9位顶级产品专家研讨提炼,凝聚腾讯产品经验的八集八分钟产品课分别从用户.定位.需求.时机.匠心.危机.合作.商业角度出发,还原产品背后的故事,分享给你腾讯产品的心法.艺形艺意工作室创 ...

  9. 焱老师带你学习MYSQL系列 第二篇 (MYSQL 数据结构)

    相关系列链接 焱老师带你学习MYSQL系列 第六篇 (MYSQL是如何实现锁的) 焱老师带你学习MYSQL系列 第五篇 (MYSQL事务隔离级别是如何实现的) 焱老师带你学习MYSQL系列 第四篇 ( ...

最新文章

  1. Java - HtmlEmail 邮件发送
  2. 数字加字符串用,隔开
  3. Matlab向量与多项式
  4. 到底逾期几次才会影响贷款申请?
  5. java中大量匿名内部类的坏处_java中的匿名内部类总结
  6. 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
  7. AIX 与Linux 中crontab 介绍
  8. 计算机主页为什么打不开怎么办,主页被限制,打不开怎么办?
  9. git指定版本openwrt源码_关于Github Action自动编译Lean_Openwrt的配置修改问题
  10. android studio for android learning (十四) android的数据的存储sharedPreferences
  11. 浅析汽车芯片信息安全之安全启动
  12. 花一周时间整理了3.5W字的全栈自动化测试面试题(答案+学习路线)!为了找到好工作,拼了!
  13. 五行代码实现MD5加密(超级简单,一看就会)
  14. 第4章-一阶多智体系统一致性 -> 连续时间系统一致性
  15. 【转】完美解决iphone连电脑蓝牙出现bluetooth外围设备无法正确安装
  16. DCDC相关故障分析记录
  17. Python读取PDF文档(或TXT)
  18. AlphaGo Model-Based RL
  19. sql安装出错,安装程序配置服务器失败的解决方案 [转]
  20. Java计算1到100阶乘和

热门文章

  1. 第10讲:高效存储 MongoDB 的用法
  2. Python 实现斐波那契数列
  3. 用Python实现队列
  4. 深入理解分布式消息队列
  5. 搞定 Go 语言,不会这些可不行
  6. 基于时序数据库做监控,这里有超流行的开源方案
  7. 探讨TensorRT加速AI模型的简易方案 — 以图像超分为例
  8. 音视频技术开发周刊(第131期)
  9. 【大会】AI能解决哪些问题?
  10. 【大会】嵌入式玩直播,IoT做前处理