• Promise就是一个用来存储数据对象,但是由于Promise存取的方式的特殊,所以可以直接将异步调用的结果存储到Promise中

Promise存储异步数据:

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a+b)},3000)     })
}

• 使用现有的Promise特性解决回调地狱问题

• Promise的回调地狱:

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a+b)},3000)     })
}
sum(8,8).then(result => {sum(result,8).then(result => {sum(result,8).then(result => {sum(result,8).then(result => {console.log(result)})})})
})

• 很明显现有的Promise特性无法解决回调地狱的可读性问题
• 我们引出Promise的返回值特性
• Promise中的
   then 
  catch
• finally
○ finally的返回值,不会存储到新Promise中

• 这三个方法都会返回一个新的Promise等价(return new Promise() ),Promise中会存储回调函数的返回值
○ Promise中存储的返回值
会被设置新的Promise的结果
• Promise的返回值存储:

const promise = new Promise((resolve,reject) => {resolve(1111)
})
const p2 = promise.then(result => {console.log("回调函数",result)result "锄禾日当午"
})
/*由于栈里面的代码被任务里面的代码先执行*/
/*所以加了一个计时器延长*/
setTimeout(() => {console.log(p2)
},1000)

• Promise返回值特性解决回调地狱

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a+b)},3000)     })
}sum(6,6).then(result => result+8).then(result => result+8).then(result => result+6).then(result => console.log(result))

○ 这种Promise的调用叫链式调用
• 链式调用
○ 对Promise进行的链式调用时后边的方法(then和catch) 读取的上一步的执行结果,如果上一步的执行结果不是当前想要的结果,则跳过当前的方法
○ 例如:

const promise = new Promise((resolve,reject) => {resolve("天外天")
})
promise.then(r => "哈哈").catch(r => console.log(r))//跳过不执行,执行下一个then方法.then(r => console.log(r))//哈哈.then(r => console.log(r))//console.log没有返回值,结果是undefined

○ 当Promise出现异常时,而整个调用链中没有出现catch,则异常向外抛出
○ 例如:

const promise = new Promise((resolve,reject) => {reject("天外天")
})
promise.then(r => "第一个then").then(r => "第二个then")//没有catch,异常向外抛出

○ 调用链里面的catch只能处理该方法前面出现的异常,该方法及该方法后面出现的异常一概不处理
○ 例如:

const promise = new Promise((resolve,reject) => {resolve("天外天")
})
promise.then(r => console.log(哈哈)).catch(r => {throw new Error("报个错玩")     })//异常向外抛出//catch只能处理该方法前面出现的异常不包括自己的异常

○ 建议把catch方法写在调用链的最后面,可以解决前面出现的异常

○ 例如:

const promise = new Promise((resolve,reject) => {resolve("天外天")
})
promise.then(r => {throw new Error("报个错玩玩")}).catch(r => {throw new Error("再报个错玩玩")}).catch(r => console.log("解决前面所有的异常")//解决前面所有的异常

• Promise静态方法
○ Promise静态方法的创建:

new Promise((resolve,reject) => {resolve(10)
})
Promise.resolve(10);//创建一个立即完成的Promise
Promise.reject("错误");//创建一个立即拒绝的Promise

○ Promise.all([...])方法
同时返回多个Promise的执行结果,其中有一个报错,就返回错误
Promise.all方法:

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a + b)},3000)})
}
Promise.all([sum(4,4),sum(6,6),sum(8,8)]).then(r => {console.log(r)//[8,12,16]})
//all数组里面的参数一个异常,全部异常
Promise.all([sum(4,4),sum(6,6),Promise.reject("哈哈")sum(8,8)]).then(r => {console.log(r)//报错})

○ Promise.allsettled([...])方法
○ 跟Promise.all差不多,不过这个方法返回的是个对象数组
○ 同时返回多个Promise的执行结果(无论失败与否)
○ 成功的数据:
{status: 'fulfilled', value: 12}
失败的数据:
{status:'rejected',reason:"哈哈"}

Promise.allsettled方法:

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a+b)},3000)})
}
Promise.allsettled([sum(6,6),sum(8,8),Promise.reject("哈哈")sum(18,18)
]).then(r => {//通过对象数组下标.status得到对应的状态console.log(r[2].status)//fulfilled//通过对象数组下标.value得到对应的数据console.log(r[2].value)//"哈哈"
})

○ Promise.race([…])方法
返回执行最快的Promise(不考虑对错)
Promise.race方法:

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a+b)       },3000)})
}
Promise.race([sum(8,8)Promise.reject(1111),//立即执行最快sum(6,6);sum(8,8);
]).catch(r => {console.log(r)//1111
})
//该方法不考虑对错,返回执行最快的Promise

○ Promise.any([…])方法
返回执行最快的fulfilled的Promise,如果Promise全部都是异常则报错。
         Promise.any方法:

function sum(a,b) {return new Promise((resolve,reject) => {setTimeout(() => {resolve(a+b)       },3000)})
}
Promise.any([sum(8,8)Promise.reject(1111),sum(6,6);sum(8,8);
]).catch(r => {console.log(r)//16
})
//返回执行最快的完成(fulfilled)的Promise//Promise都报错抛异常
Promise.any([Promise.reject(1111),Promise.reject(2222),Promise.reject(3333)
]).catch(r => {console.log(r)//都报错抛异常
})

node.js Promise详解(尚硅谷李立超老师视频笔记)相关推荐

  1. 尚硅谷李立超老师讲解web前端网课的笔记

    初学 web 前端笔记一 刚刚看完网课,趁着脑子里还有点东西,小彭赶紧来做个笔记~接下来看吧: 一.软件的分类 1.系统软件:(我们买电脑或手机第一件事就是先激活或者安装一个"灵魂" ...

  2. 尚硅谷李立超老师讲解web前端---笔记(持续更新)

    目录 一.准备(2023.2.8) 二.组成部分(2023.2.8) 1.HTML 2.CSS 3.layout 一.准备(2023.2.8) 专业英语: 在进行编写布局时,我们使用的类名通常用英文编 ...

  3. 尚硅谷李立超老师讲解web前端网课笔记

    HTML的重要知识点: 初学web笔记一(语义化标签) h标签表示一个标题,p标签表示一个段落,hgroup用于标题分组,em标签用于语意加重,blockquote表示长引用(会自动换行),q表示短引 ...

  4. 尚硅谷李立超JavaScript笔记

    李立超老师JavaScript笔记 目录 1.JS简介 2.JS的HelloWorld 3.JS代码编写的位置 4.JS的基本语法 5.字面量与变量 6.标识符 7.数据类型 8.强制类型转换 1. ...

  5. [JS]JavaScript基础学习笔记(黑马pink+尚硅谷李立超)

    文章目录

  6. 尚硅谷(李立超)——HTML5CSS3笔记总结【持续更新】

    尚硅谷(李立超)--HTML5&CSS3笔记总结[持续更新] 本文适合前端菜鸟食用,小编自己整理的李立超老师视频的笔记,手打不易,那就望您每年快乐吧.逃) 一.进制 1.十进制(日常使用): ...

  7. 尚硅谷 张天禹老师vue2笔记(方便自己查阅)

    视频链接: 文章目录 尚硅谷 张天禹老师vue2笔记 脚手架文件结构 关于不同版本的Vue vue.config.js配置文件 ref属性 props配置项 mixin(混入) 插件 scoped样式 ...

  8. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  9. Node.js 入门详解 (三)

    目录 1. 初识Express 1.1 Express简介 1.1.1 什么是Express 1.1.2 进一步理解 Express 1.1.3 Express能做什么 1.1.4 Express 中 ...

最新文章

  1. 29.9. Klish - Kommand Line Interface Shell (the fork of clish project)
  2. javascript中var、let、const声明的区别
  3. 关于六年级定格动画计算机教案,定格动画教案
  4. myeclipse 2016 ci3破解教程(含软件下载)
  5. poj2385 基础的动态规划算法 挑战程序设计竞赛
  6. 【kubernetes / k8s 踩坑记录】一定要关闭SWAP
  7. 编程大神进阶,Python技巧小贴士
  8. 走得快?走的远?---【锻炼身体 好好学习】
  9. 思科路由器2811如何重设密码
  10. Java Web实训项目:西蒙购物网1
  11. php随笔_PHP随笔笔记
  12. Cocos2dx基础手册
  13. threejs学习笔记:贴图实现木地板效果
  14. Eclipse创建子包时显示与父包是并列关系的解决方法
  15. 后羿采集器怎么导出数据_后羿采集器教程:如何采集东方财富网股票数据
  16. 苹果6s plus信号显示无服务器,苹果iPhone 6Splus手机一直无服务如何解决
  17. oracle pga的作用,ORACLE PGA 的调整
  18. 雅可比行列式_二重积分换元法、雅可比行列式
  19. 世平信息数据安全合规检测实践论文入选中文核心期刊
  20. 2021-912--51单片机串口通信--SCON方式1

热门文章

  1. 单调队列用法 deque
  2. Canvas与图层(二)画布与图层
  3. C#游戏编程:《控制台小游戏系列》之《七、键盘熟练工实例》
  4. gcc/g++静态与动态链接库
  5. 毕业找到工作后很久未更新博客了(后续不定时更新)
  6. MT9813全套资料包及应用笔记
  7. mysql查询删除重复记录查询_mysql怎么查询和删除重复记录
  8. “韭菜”如何在熊市中求生存
  9. 什么产品适合做私域流量?品牌都适合做私域吗
  10. 关于TeamViewer远程桌面的呼出和呼入连接报告简单介绍