Promise基本概念和基本示例使用
0.引子
1.什么是promise?
promise是ES6中新增的异步编程解决方案
, 在代码中的表现是一个对象
2.promise作用
- 企业开发中为了保存
异步代码的执行顺序
, 那么就会出现回调函数层层嵌套
- 如果回调函数嵌套的层数太多, 就会导致代码的阅读性, 可维护性大大降低
- promise对象可以将异步操作以同步流程来表示, 避免了回调函数层层嵌套(回调地狱)
例如:
需求: 从网络上加载3个资源, 要求加载完资源1才能加载资源2, 加载完资源2才能加载资源3,前面任何一个资源加载失败, 后续资源都不加载
function request(fn) {setTimeout(function () {fn("拿到的数据");}, 1000);}request(function (data) {console.log(data, 1);request(function (data) {console.log(data, 2);request(function (data) {console.log(data, 3);});});});// 回调函数层层嵌套
使用promise
function request() {return new Promise(function (resolve, reject) {setTimeout(function () {resolve("拿到的数据");}, 1000);});}request().then(function (data) {console.log(data, 1);return request();}).then(function (data) {console.log(data, 2);return request();}).then(function (data) {console.log(data, 3);});
一、基础概念
1.什么是Promise?
Promise是ES6中新增的一个对象,
通过Promise就可以实现 用同步的流程来表示异步的操作
通过Promise就可以 避免回调函数层层嵌套(回调地狱
)问题
2.如何创建Promise对象?
new Promise(function(resolve, reject){});
promise对象不是异步的, 只要创建promise对象就会立即执行存放的代码
3.Promise是如何实现 通过同步的流程来表示异步的操作的?
promise对象是通过状态的改变来实现的, 只要状态发生改变就会自动触发对应的函数
4.Promise对象三种状态
pending
: 默认状态,只要没有告诉promise任务是成功还是失败就是pending状态fulfilled(resolved)
: 只要调用resolve函数, 状态就会变为fulfilled, 表示操作成功rejected
: 只要调用rejected函数, 状态就会变为rejected, 表示操作失败- 注意点:
状态一旦改变既不可逆
, 既从pending变为fulfilled, 那么永远都是fulfilled,既从pending变为rejected, 那么永远都是rejected
5.监听Promise状态改变
我们还可以通过函数来监听状态的变化
- resolved --> then()
- rejected --> catch()
二、promise-then方法
1.then方法接收两个参数
- 第一个参数是
状态切换为成功时
的回调 - 第二个参数是
状态切换为失败时
的回调
let promise = new Promise((resolve, reject)=>{// resolve() // 将状态修改为成功,执行成功时的回调reject() // 将状态修改为失败,执行失败时的回调})promise.then(function(){console.log('成功时的回调');},function(){console.log('失败时的回调');})
2.在修改promise状态时,可以传递参数给then方法中成功的回调
let promise = new Promise((resolve, reject)=>{// resolve() // 将状态修改为成功,执行成功时的回调reject('123') // 将状态修改为失败,执行失败时的回调})promise.then(function(){console.log('成功时的回调');},function(res){console.log('失败时的回调', res);})
=========>
function success(){console.log('success123');}function error(data){console.log('error',data);}let promise = new Promise((resolve, reject)=>{// resolve() // 将状态修改为成功,执行成功时的回调reject('123') // 将状态修改为失败,执行失败时的回调})promise.then(success, error)
3.同一个promise对象可以多次调用then方法,当该promise对象的状态时所有
then方法都会被执行
let promise = new Promise((resolve, reject)=>{// resolve() // 将状态修改为成功,执行成功时的回调reject('123') // 将状态修改为失败,执行失败时的回调})promise.then(function(){console.log('成功时的回调1');},function(res){console.log('失败时的回调1', res);})promise.then(function(){console.log('成功时的回调2');},function(res){console.log('失败时的回调2', res);})
4. then方法每次执行完毕后会返回一个新的promise对象
let promise = new Promise((resolve, reject)=>{// resolve() // 将状态修改为成功,执行成功时的回调reject('123') // 将状态修改为失败,执行失败时的回调})let p2 = promise.then(function(){console.log('成功时的回调1');},function(res){console.log('失败时的回调1', res);})console.log(p2); // promise对象console.log(p2 === promise); // false
5.可以通过上一个promise对象的then方法给下一个promise对象的then方法传递参数
注意点:
无论是在上一个promise对象成功的回调还是失败的回调传递的参数,
都会传递给下一个promise对象成功
的回调
let promise = new Promise((resolve, reject) => {// resolve() // 将状态修改为成功,执行成功时的回调reject('123') // 将状态修改为失败,执行失败时的回调})let p2 = promise.then(function (res) {console.log('成功时的回调1', res);return '123'}, function (res) {console.log('失败时的回调1', res);return 'bbb'})p2.then(function (res) {console.log('成功时的回调2', res);}, function (res) {console.log('失败时的回调2', res);})
then方法返回的promise在promise.then可以接收到then方法return的参数
6.如果then方法返回的是一个Promise对象
, 那么会将返回的Promise对象的执行结果中的值
传递给下一个then方法
let promise = new Promise((resolve, reject)=>{resolve('1')})let ppp = new Promise((resolve, reject)=>{reject('ppp')})let p1 = promise.then(function(data){console.log('成功1', data);return ppp},function(data){console.log('失败1', data);})p1.then(function(data){console.log('成功2', data);},function(data){console.log('失败2', data);})
三、promise-catch方法
1.catch
其实是 then(undefined, () => {})
的语法糖,没有成功的回调,只有失败的回调
let promise = new Promise(function (resolve, reject) {// resolve(); // 将状态修改为成功reject(); // 将状态修改为失败});promise.catch(function () {console.log("abc");});
2.分开监听使用链式编程
如果需要分开监听, 也就是通过
then监听成功
通过catch监听失败
那么必须使用链式编程, 否则会报错
let promise = new Promise((resolve, reject)=>{reject()})promise.then(function(){console.log('成功1');})promise.catch(function(){console.log('err');}) // 能监听到失败,但是会报错
=修改=>
promise.then(function(){console.log('成功1');}).catch(function(){console.log('err');})
2.1 使用链式编程的原因是
- 1.如果promise的状态是
失败
, 但是没有对应失败的监听就会报错 - 2.then方法会返回一个
新的promise
, 新的promise会继承
原有promise的状态 - 3.如果新的promise状态是
失败
, 但是没有
对应失败的监听
也会报错
let promise = new Promise(function (resolve, reject) {// resolve(); // 将状态修改为成功reject(); // 将状态修改为失败});let p2 = promise.then(function () {console.log("成功");});console.log(p2);promise.catch(function () {console.log("失败1");});// P2新的promise继承原有的promise状态,状态是失败,没有对应失败的监听会报错p2.catch(function () {console.log("失败2");});
3.和then一样, 在修改promise状态时, 可以传递参数给catch方法中的回调函数
let promise = new Promise((resolve, reject)=>{reject('失败了哦')})promise.catch(function(data){console.log(data); // 失败了哦})
4.和then一样, 同一个promise对象可以 多次 调用catch方法, 当改变promise对象的状态时所有catch方法都会被执行
let promise = new Promise((resolve, reject) => {reject()})promise.catch(function () {console.log('失败1');})promise.catch(function () {console.log('失败2');})promise.catch(function () {console.log('失败3');})/**执行结果失败1失败2失败3*/
5.和then一样, catch方法每次执行完毕后
会返回一个 新的promise对象
let promise = new Promise((resolve, reject) => {reject()})let p1 = promise.catch(function () {console.log('失败1');})console.log(p1);console.log(p1 === promise);
6.和then方法一样, 上一个promise对象
也可以 给 下一个promise 成功的
传递参数
注意点:
无论是在上一个promise对象成功的回调还是失败的回调
传递的参数,
都会传递给下一个promise对象成功的回调
let promise = new Promise(function (resolve, reject) {reject();});let p2 = promise.catch(function () {console.log("失败1");return "it666";});p2.then(function (data) {console.log("成功2", data);}, function (data) {console.log("失败2", data);});/*执行结果:失败1成功2,it666*/
7.和then一样, catch方法如果 返回的是一个 Promise对象
, 那么会将返回的Promise对象的执行结果
中的值传递给下一个 catch方法
let promise = new Promise(function (resolve, reject) {reject();});let ppp = new Promise(function (resolve, reject) {// resolve("1111");reject("abcd");});let p2 = promise.catch(function () {console.log("失败1");return ppp;});p2.then(function (data) {console.log("成功2", data);}, function (data) {console.log("失败2", data);});/*执行结果:失败1失败2 abcd*/
8.和then方法第二个参数的区别在于, catch方法可以捕获
上一个promise对象then方法中的异常
then方法中
let promise = new Promise(function (resolve, reject) {resolve();});promise.then(function () {console.log("成功");xxx}, function () {console.log("失败");});
catch方法中:
let promise = new Promise(function (resolve, reject) {resolve();});promise.then(function () {console.log("成功");xxx}).catch(function (e) {console.log("失败", e);});
学习笔记❥(^_-)
Promise基本概念和基本示例使用相关推荐
- UE4 Matinee功能基本概念及简单示例(Sequence编辑器)
UE4 Matinee功能基本概念及简单示例(Sequence编辑器) https://gameinstitute.qq.com/community/detail/122091 UE4提供的Matin ...
- 开发常见密码技术概念RSA使用示例
一.单向散列函数 1.1 概念及术语 单向散列函数(one-way hash function)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value).单向散 ...
- 多线程(线程概念、代码示例)
进程和线程 说起进程,就必须提一下程序,程序是指令和数据的有序集合,是一个静态的概念 进程是执行程序的一次执行过程,第一个动态的概念,是系统资源分配的单位 在一个进程中包含若干个线程,线程是独立的执行 ...
- Mahout-协同过滤-CF-推荐算法基本概念及代码示例
协同过滤 协同过滤是利用集体智慧的一个典型方法.要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部 ...
- 【集合论】卡氏积 ( 卡氏积概念 | 卡氏积示例 | 卡氏积性质 | 非交换性 | 非结合性 | 分配律 | 有序对为空 | n 维卡氏积 | n 维卡氏积个数 | n维卡氏积性质 )
文章目录 一. 卡氏积 二. 卡氏积示例 三. 卡氏积性质 四. n 维卡氏积 五. n 维卡氏积个数 六. n 维卡氏积性质 前置博客 : [集合论]有序对 ( 有序对 | 有序三元组 | 有序 n ...
- js 异步函数讲解: Promise、async和await示例
ECMAScript 2015,也称为 ES6,引入了 JavaScript Promise 对象,用于异步执行运行时间较长的任务. 有两种方式来实现异步编程: 一是使用Promise对象,二是使用a ...
- scala 模式匹配概念及用法示例
概念 可以理解为升级版的java switch 1 java中的switch -case是一个分支结构,用于匹配整型(byte,short,int,char),字符串,枚举. (long类型不可以) ...
- 【STM32】详解RTC实时时钟的概念和配置示例代码
一.什么是RTC RTC(Real-time Clock):实时时钟,本质上是一个支持BCD编码的定时器/计数器.主电源断电后能够由电池供电,使其时钟跳转依然正常. 二.STM32F4芯片内的RTC功 ...
- 达梦物化视图概念及简单示例
物化视图是从一个或几个基表导出的表,同视图相比,它存储了导出表的真实数据(即物化视图是占磁盘存储空间的),当基表中的数据发生变化时,物化视图所存储的数据将变得陈旧,用户可以通过手动刷新或自动刷新来对数 ...
最新文章
- linux下导入、导出mysql数据库命令
- vue router按需加载
- 中文 iOS/Mac 开发博客列表
- 华为荣耀七能升级鸿蒙系统吗,华为鸿蒙系统来了,你知道哪些华为手机荣耀手机可以升级吗?...
- 高性能缓存服务器Varnish架构配置
- Android2.2缩略图类ThumbnailUtils
- CDays-3 习题一 (处理命令行参数)及相关内容解析。Python getopt 简介
- android nfc MifareUltralight读写
- 软件安装及软件包管理
- 「 机器人学 」机器人与控制工程基础浅谈
- mysql frm myd myi 恢复_恢复 - 如何从.myd,.myi,.frm文件恢复MySQL数据库
- 这个开源项目有点强,无需编码,可一键生成前后端代码
- 龙芯3A5000笔记本安装开源操作系统loongnix记录
- 【图像融合】基于多尺度引导实现图像融合附matlab代码
- SDK之aar封装总结
- Linux部署Oracle11gR2 RAC详细教程
- 一个-书,字 我惆怅
- 贝叶斯优化: 一种更好的超参数调优方式
- UTF-8 and Unicode FAQ
- 不懂就问,刚用vs2019运行一个c++为什么会这样啊
热门文章
- 实验2-1-1 计算摄氏温度 (5 分)
- error: The following untracked working tree files would be overwritten by merge:
- 原生微信小程序添加背景音乐
- 二维绕任意点旋转_解析几何|对称,平移和旋转
- 计算机html二级难度,计算机二级考试越来越难的实锤!真实数据告诉你到底难在哪里?...
- 用python统计文章中单词出现的频次
- python print table_python 6.7 编写printTable()函数表格打印(完整代码)
- 计算几何-Andrew法-凸包
- HTTP相关知识 --转载
- Vivado入门使用指南之----多路分频器(逻辑分析仪IP的使用以及前后仿真及ip的基本使用)