es6 Promise对象

淡淡的烟草味﹌ 2021-07-25 00:44 717阅读 0赞
  1. ES6 Promise对象
  2. 1、优点:
  3. 1、代表未来某个将要发生的事件(通常是一个异步操作)
  4. 2、可以将异步操作以同步的流畅表达出来,避免了层层嵌套的回调函数即回调地狱
  5. 3、避免异步回调不好写异常处理的问题
  6. 4、方便阅读
  7. 2Promise对象三个状态,即实例上内置的[[PromiseState]]属性的值,该属性无法操作,状态只能改变一次
  8. pending:初始状态,即不调用resolve/reject或抛出错误的状态
  9. fullfilled/resolved:成功状态
  10. rejected:失败状态,reject或抛出异常
  11. 只有当pending状态改变了,才会触发.then回调
  12. 3Promise内置属性:内置属性无法操作,即不能读和写
  13. [[PromiseState]] promise对象的三个状态
  14. [[PromiseResult]] 传递给resolve/reject方法的值
  15. 4Promise内部函数同步调用,执行器函数异步调用.then中的方法参数
  16. new Promise((resolve,reject)=>{
  17. console.log() 同步调用
  18. resolve() 执行器可以在异步函数中调用
  19. })
  20. 5、使用Promise:
  21. 创建:
  22. 创建Promise对象
  23. let promise =new Promise((resolve,reject)=>{
  24. 若成功使用resolve(数据);
  25. 若失败使用reject(数据)/throw 异常
  26. })
  27. 接收:
  28. Promise实例对象.then((resolve传递的数据)=>{
  29. 成功回调
  30. },(reject传递的数据)=>{
  31. 失败回调
  32. }).finally(()=>{
  33. 最后总会执行的回调
  34. })
  35. 其中:失败回调有两种接受方式:
  36. 方式一:.then的第二个函数参数,会覆盖掉.catch
  37. 方式二:.catch()
  38. .catch只能接收之前返回Promise对象的reject失败回调或throw Error的异常
  39. p.catch()直接调用
  40. p.then(()=>{}).catch((err)=>{...});
  41. 返回一个Promise对象:返回结果同.then相同
  42. 6、多个分开的.then方法,只有在Promise状态pending改变后才会执行,否则不执行
  43. p.then(()=>{})
  44. p.then(()=>{})
  45. 7、链式.then调用
  46. .then会返回一个Promise对象,[[PromiseResult]]的值即为返回的普通值/Promise调用了resolve/reject的结果,若执行器函数还未执行,则[[PromiseState]]为pending
  47. 第一个.then,若无返回值,且resolve执行器已执行,则返回状态为fullfilled,返回结果为undefined
  48. 未执行前未pending,执行后会修改状态
  49. .then中正常返回结果(在执行器函数执行后)
  50. 若返回Promise实例对象,返回状态和值和该Promise实例对象相同
  51. 若返回普通值,返回状态为fullfilled,结果为普通值结果
  52. 若无返回值,返回状态为fullfilled,结果为undefined
  53. .then非正常返回结果:
  54. 若没有返回值,[[PromiseResult]]的值为undefined
  55. 若抛出异常,则[[PromiseState]]为rejected,[[PromiseResult]]为出错信息
  56. 异常穿透:
  57. 可以在最后调用.catch()或.then(()=>{},(err)=>{}),捕捉之前链式调用中的失败回调(reject()/throw)
  58. 中断链式调用:
  59. 返回一个pending状态的promise对象,return new Promise(()=>{})
  60. 原因:当返回pending状态的promise对象,.then也会返回一个pending状态的promise对象,状态没有改变,后面的.then方法不会执行
  61. 8Promise方法:
  62. Promise.resolve(value):
  63. 传入非Promise类型:返回一个fullfilled状态的promise对象
  64. 传递的Promise实例对象:返回的promise状态和传入的promise状态相同,即决定了用.then还是.catch解析
  65. 用处:可用来封装返回一个promise对象
  66. Promise.reject(value):
  67. 传入非Promise类型:返回一个rejected状态的promise对象
  68. 传递的Promise实例对象:会返回rejected状态的promise对象,值就为传递的promise对象
  69. Promise.all():
  70. Promise.all返回值:
  71. 会等到前一个promise执行完,才执行后面的promise
  72. 若传入的所有promiseresolve,则返回一个fullfilled状态、值为所有resolve结果组成的数组的Promise对象
  73. 若有一个promiserejectthrow,则返回一个rejected状态、值为失败reject结果/抛出错误的Promise对象
  74. Prmosise.all([Promise对象,...]).then(res=>{
  75. 返回结果是集合中所有resolve的结果或return返回结果集合
  76. }).catch(err=>{
  77. 当有一个reject执行就会抛出错误,错误信息为第一个reject执行的内容
  78. })
  79. 例子:
  80. 当添加async后,map会自动返回Promise对象,最外层await的结果是内部每个Promise执行完毕返回的结果
  81. let res=await Promise.all(filePath.map(async (path) => {
  82. const data = await readFile(path);
  83. return data;
  84. }))
  85. Promise.allSettled():
  86. 返回一个在所有给定的promise都已经fulfilledrejected后或者普通值(不能函数返回)的promise
  87. Promise.allSettled([...]).then((res)=>{
  88. res为一个对象数组,每个对象表示对应的promise结果,{status: "fulfilled等状态", value: 结果}
  89. })
  90. 例子:
  91. const promise1 = Promise.resolve(3);
  92. const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
  93. const promises = [promise1, promise2,2];
  94. Promise.allSettled(promises).
  95. then((results) => results.forEach((result) => console.log(result))).
  96. catch(err => { console.log(err) });
  97. Promise.any():
  98. 所有给定的promise中只要其中的一个promise成功,就返回那个已经成功的promise,都reject则返回失败的 promise AggregateError
  99. Promise.any([promise,或普通值]).then((value) => {
  100. }).catch(err=>...)
  101. Promise.race():
  102. 返回给定的promise中第一个resolverejectpromise
  103. Promise.race([promise1, promise2]).then((value) => {
  104. console.log(value);
  105. }).catch(err=>console.log(err))

代码示例:
回调地狱:
在这里插入图片描述
运行流程:
在这里插入图片描述

  1. <html ng-app='app' ng-controller='main' >
  2. <head>
  3. <meta charset="utf-8">
  4. <meta name='viewport' content='width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0'>
  5. <script src='jq/jquery-3.4.1.js'></script>
  6. <style>
  7. </style>
  8. </head>
  9. <body >
  10. <script>
  11. let promise=new Promise((resolve,reject)=>{
  12. //执行异步操作,如发送ajax请求、开定时器等
  13. console.log(1);
  14. setTimeout(function(){ console.log(2)
  15. //根据异步任务返回结果修改promise状态
  16. //若异步任务执行成功
  17. resolve('成功传递'); //自动修改promise的状态为成功:fullfilled;
  18. //若异步任务失败
  19. //reject('失败传递');
  20. },2000)
  21. });
  22. promise.then((data)=>{ //成功回调函数
  23. console.log(`成功:${ data}`);
  24. },(data)=>{ //失败回调函数
  25. console.log('失败');
  26. })
  27. </script>
  28. </body>
  29. </html>

发表评论

表情:
评论列表 (有 0 条评论,717人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6--Promise对象

    Promise对象:代表了未来某个将要发生的操作,通常是异步操作 promise对象可以将异步操作以同步的流程表达出来,避免了层层嵌套的 回调函数(回调地狱),ES6的

    相关 ES6 -- Promise对象

    Promise是一种异步编程的解决方案,ES6提供原声的Promise,它比传统的解决方案,回调函数和事件,更加合理和强大。 Promise对象有以下两个特点: 1、对象的

    相关 es6Promise 对象

    Promise 是异步编程的一种解决方案,解决——回调函数和事件 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。 下面代码创造了一个Prom

    相关 ES6标准----Promise对象

       Promise的含义:         Promise是异步编程的一种解决方法,比传统的解决方法——回调函数和事件—更合理和强大。    它由社区最早提出和实现,

    相关 ES6--Promise对象

    概述 是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。 Promise 状态 状态的特点 Promise 异步操