Promise

1.Promise 是什么,结构?

1.1本质

Promise(MDN)本质上是一个函数返回的对象,在上面绑定回调后就不需要在一开始把回调函数作为参数传入。–>异步函数调用;一旦Promise的值确定后就不再改变。
从语法上来说:Promise是一个构造函数
从功能上来说:Promise对象用来封装一个异步操作并可以获得其结果

  • 对比:then 是原型对象方法;new Promise 是实例对象方法;Promise.all是 promise函数对象方法

  • 例子:假设现在有一个名为 createAudioFileAsync() 的函数,它接收一些配置和两个回调函数,然后异步地生成音频文件。一个回调函数在文件成功创建时被调用,另一个则在出现异常时被调用。
    之前的用法:

// 成功的回调函数
function successCallback(result) {console.log("音频文件创建成功: " + result);
}// 失败的回调函数
function failureCallback(error) {console.log("音频文件创建失败: " + error);
}createAudioFileAsync(audioSettings, successCallback, failureCallback)

现在有了Promise的用法:

createAudioFileAsync(audioSettings).then(successCallback, failureCallback);

2.Promise 的三种状态:pending(未决定),fulfilled(履行),rejected(拒绝)

2.1 pending

初始化状态是pending;
pending 状态不会触发then和catch

2.2 fulfilled

当调用resolve(成功),状态由pending变成fulfilled;
resolved 状态会出发后续的then正确回调函数,而then函数正常会返回resolved,报错会返回rejected

2.3 rejected

当调用reject(失败),状态由pending变成rejected;
rejected状态会触发后续的catch错误回调,而catch政策会返回resolved,报错会返回rejected

3.Promise的优缺点

3.1 优点

(1)支持链式回调,解决回调地狱(Callback Hell)
有时候我们进行一些依赖其他异步操作的异步操作,比如:有多个请求,后一个请求需要上一次请求的返回结果。过去只能一层层callback嵌套,太多的话就行层了回调地狱,而且可维护性差。
(2)更好的进行错误捕获

如果不用promise。多重嵌套的问题,会引发无法捕获异常或异常捕获不可控。

function fetch(callback) {setTimeout(() => {throw Error('请求失败')}, 2000)
}try {fetch(() => {console.log('请求处理') // 永远不会执行})
} catch (error) {console.log('触发异常', error) // 永远不会执行
}// 程序崩溃
// Uncaught Error: 请求失败

如果使用promise的话,通过reject方法把状态置为rejected,在then就可以捕捉到,然后执行“失败”的回调。

function fetch(callback) {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求失败');}, 2000)})
}fetch()
.then(function(data){console.log('请求处理');console.log('data',data);},function(reason, data){console.log('触发异常');console.log('reason:',reason);}
);

3.2 Promise缺点

(1)无法取消Promise,一旦新建它就会立即执行,无法中途取消。
(2)如果不设置回调函数,promise内部抛出的错误,不会反应到外部。—没get到
(3)当处于pending状态时,无法得知目前进展到哪一个阶段(pending还是fulfilled)
(4)Promise真正执行回调的时候,定义Promise那部分实际上已经走完了,所以Promise的报错堆栈上下文不太友好。

4.Promise解决什么问题?

解决了回调地狱,层层嵌套的异步回调函数会使得错误捕获难。

Promise 是一种帮助处理一类特定的异步编程的方式:一个函数(或者方法)异步地返回结果。为了实现这样的函数,需要返回一个 Promise ,它是最终返回结果的一个占位符对象。函数的调用者在 Promise 对象上注册回调,一旦结果计算出来了,就可以收到通知。函数通过 Promise 发送结果。

5.怎么用Promise,什么时候用Promise而不是传统的回调函数?

—当需要多次顺序执行异步操作的时候。

5.1 常见的promise Q&A(FAQ)

Q: then、catch 和 finally 序列能否顺序颠倒?
A: 可以,效果完全一样。但不建议这样做,最好按 then-catch-finally 的顺序编写程序。
Q: 除了 then 块以外,其它两种块能否多次使用?
A: 可以,finally 与 then 一样会按顺序执行,但是 catch 块只会执行第一个,除非 catch 块里有异常。所以最好只安排一个 catch 和 finally 块。 Q: then 块如何中断?
A: then 块默在这里插入代码片认会向下顺序执行,return 是不能中断的,可以通过 throw 来跳转至 catch 实现中断。
Q: 什么时候适合用 Promise 而不是传统回调函数?
A: 当需要多次顺序执行异步操作的时候,例如,如果想通过异步方法先后检测用户名和密码,需要先异步检测用户名,然后再异步检测密码的情况下就很适合 Promise。
Q: Promise 是一种将异步转换为同步的方法吗?
A: 完全不是。Promise 只不过是一种更良好的编程风格。
Q: 什么时候我们需要再写一个 then 而不是在当前的 then 接着编程?
A: 当你又需要调用一个异步任务的时候。

6.Promise和async/await

对于Promise来说,他仍然是个异步操作,返回异步操作的结果。
但是async/await 是不关心是否是异步操作,这就是异步操作的最高境界,将异步强行转换为同步处理。
(1)async/await 与Promise不存在谁取代谁的说法,因为async/await是寄生于Promise,Generater的语法糖。

6.1 async/await用法

(1)async 用于申明一个function是异步的,而await可以认为是async wait(await)的简写,等待一个异步方法执行完成。

  1. async和await是配对使用的,await存在于async的内部,否则会报错。
    2.await表示在这里等待一个promise返回,再执行。
    3.await 后面跟着的应该是一个Promise对象

6.2 try-catch 捕捉

如果是reject 状态,可以用try-catch 捕捉

let p = new Promise((resolve,reject) => {setTimeout(() => {reject('error');},1000);
});async function demo(params) {try {let result = await p;}catch(e) {console.log(e);}
}demo();

6.3 promise和async/await 区别

(1)promise是ES6,async/await是ES7
(2)async/await相对于promise来讲,写法更加优雅
(3)reject状态:promise错误可以通过catch捕捉,建议尾部捕获错误;async/await既可以用.then又可以用try-catch

7.手写Promise

https://juejin.cn/post/6994594642280857630?utm_source=gold_browser_extension

从这里可以总结出4个Promise的点:
(1)执行了resolve,Promise的状态就会变成fulfilled
(2)执行了reject,Promise的状态就会变成rejected
(3)Promise只以第一次为准,第一次成功就永久为fulfilled,第一次失败就永久成为rejected
(4)Promise中有throw的话,就相当于执行了reject

2021-8-12这篇关于Promise用法的标题我不知道怎么起了相关推荐

  1. 第二篇:猴博士求极限[2021.7.12完成]

    利用Typora编辑器做"求极限"公式笔记 五.∞·0型 把 相 对 简 单 项 变 为 1 1 相 对 简 单 项 把相对简单项\large变为\frac{1}{\frac{1} ...

  2. pandas object转float_数据分析篇 | Pandas基础用法6【完结篇】

    这是最后一篇,至此Pandas系列终于连载完了,有需要的也可以看看前面6篇,尽请收藏. 数据分析篇 | Pandas 概览 数据分析篇 | Pandas基础用法1数据分析篇 | Pandas基础用法2 ...

  3. promise用法_图解 Promise 实现原理(四):Promise 静态方法实现

    作者:Morrain 转发链接:https://mp.weixin.qq.com/s/Lp_5BXdpm7G29Z7zT_S-bQ 前言 Promise 是异步编程的一种解决方案,它由社区最早提出和实 ...

  4. 2021年12月电子学会图形化四级编程题解析含答案:聪明的小猫

    [此题目来自2021年12月份电子学会] [青少年软件编程(图形化)等级考试试卷(四级)] 三.编程题(共5题,共50分) 28.聪明的小猫 有3张卡片,每张卡片上面分别写着1.2.3,从中抽出一张. ...

  5. CAR-T细胞治疗最新进展(2021年12月)

    [教程]CAR-T细胞治疗GMP生产技术G-Rex培养系统 更多G-Rex培养系统技术详情,请搜索"泽平科技"进入咨询. [1]Cell子刊:T细胞衰竭影响CAR-T细胞临床疗效 ...

  6. 3D打印机硬件驱动-马林固件最新版本2.0.X中文注释(1)marlin 2.0.9.2 截至发稿时间2021年12月16日

    马林固件最新版本翻译注释 /*============================================================================== Marlin ...

  7. 2021年12月电子学会图形化三级编程题解析含答案:数星星

    [此题目来自2021年12月份电子学会] [青少年软件编程(图形化)等级考试试卷(三级)] 三.编程题(共3题,共30分) 36:数星星 Goblin有个很厉害的魔法:他一挥手就可以点亮夜空中五彩斑斓 ...

  8. 2021年12月电子学会图形化三级编程题解析含答案:跳高比赛

    [此题目来自2021年12月份电子学会] [青少年软件编程(图形化)等级考试试卷(三级)] 三.编程题(共3题,共30分) 38:跳高比赛 1.准备工作 (1)删除小猫角色,添加角色"Mon ...

  9. 平静的纪中生活(2021.7.12~7.22)

    平静的目录 Day 0 凌晨(不要问为什么有这个) 早上 下午 晚上 Day 1 早上 中午 下午 晚上 今天的博客 Day 2 早上 中午 下午 晚上 今天的博客 Day 3 早上 中午 下午 晚上 ...

最新文章

  1. 腾讯视频app下载2019_腾讯视频主设备如何设置
  2. P3146 [USACO16OPEN]248 G(python3实现)
  3. 【STL】List基础
  4. 教你如何用机翻软件开拓自己的青青草原
  5. 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建
  6. js获取浏览器信息以及判断是否是微信
  7. 如何写项目文档?项目文档有哪些?
  8. maven项目中的pom文件依赖关系
  9. 迅雷种子为什么php文件后缀,迅雷BT文件后缀是什么?
  10. 夏天宝宝晚上睡觉不踏实怎么办?
  11. 【Web前端HTML5CSS3】05-样式继承与其他概念
  12. 給windowsXP穿上Linux Ubuntu的漂亮馬甲
  13. 新中式玄关设计方法,设计玄关注意事项
  14. HTML <kbd> 标签
  15. 上海BFC外滩金融中心潮流新店,aaddd揭秘全新生活美学
  16. Ubuntu 20.04 boot repair(镜像引导目录修复)
  17. Nginx+PHP+MySQL分离部署+社区论坛
  18. android 瀑布流 空白,Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题...
  19. cordova Vue 保存视频/图片到相册 - 实现下载视频/图片到相册
  20. SQL菜鸟笔记之第一篇 实验环境的搭建及准备工作

热门文章

  1. java环境变量的设置方法_Java配置环境变量、方法和原因
  2. 设计模式的艺术 工厂方法模式
  3. mikrotik 设置
  4. pandas 用某一列的值替换另一列的空缺值
  5. Linux缓冲区(无缓冲,行缓冲,全缓冲)的区别
  6. “拒绝了对对象数据库的 EXECUTE 权限”之解决
  7. Centos7中DNS的安装与配置(失败)
  8. 初级选手表示太好玩了 | python turtle绘图集锦(哆啦A梦、捂脸表情)
  9. python url编码与解码
  10. MFC查找指定文件是否存在,PathFileExists 函数