经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
Promise精简总结
来源:cnblogs  作者:竹林取剑  时间:2021/2/18 15:32:41  对本文有异议

前言 : 个人总结,不是教程,如有错误,欢迎各位批评指正。

 

主要作用:

   解决回调地狱

 

简单使用

  1. // 创建Promise
  2. let p = new Promise((resolve, reject) => {
  3. let i = Math.random();
  4. if (i < 0.5) resolve("a");
  5. else reject("b");
  6. });
  7. // resolve传递的参数进入第一个回调函数,reject传递的进入第二个回调函数
  8. p.then((arg) => console.log("resolve === ",arg), (arg) => console.log("reject === ",arg));
  9. // 与上面代码等价
  10. p.then((arg) => console.log("resolve === ",arg)).catch((arg) => console.log("reject === ",arg))

 

Promise属性

  PromiseState:

    1.padding : 未决定

    2.resolved / fullfilled : 成功

    3.rejected 失败

    resolve/reject调用前状态为pending, 调用后分别对应状态 2 , 3  

       promise中抛出错误会将promise状态改变为rejected

 

  PromiseResult

    保存着 resolve/reject调用时 传递的结果

 

工作流程

  

 

 

 

 

 

方法

  Promise.resolve(value) 

  作用:用于快速创建Promise,如果传入的参数为非promise,则返回一个fullfilled类型的,值为value的promise。若传入值为promise,则返还的promise状态与值与传入的promise相同

  

  1. let p1 = Promise.resolve(123);
  2. p1.then(console.log)
  3. // 123
  4. let p1 = Promise.resolve(new Promise((resolve,reject) => {
  5. resolve(456);
  6. }));
  7. p1.then(console.log);
  8. // 456
  9. let p1 = Promise.resolve(new Promise((resolve,reject) => {
  10. reject(789);
  11. }));
  12. p1.catch(console.log)
  13. // 789

  

 

Promise.reject(value) 

  作用:用于快速创建Promise,如果传入的参数为非promise,则返回一个rejected类型的,值为value的promise。若传入值为promise,则返还类型为rejected,值为传入的promise的promise对象

 

 

  1. let p1 = Promise.reject(new Promise((resolve,reject) => {
  2. resolve(123);
  3. }));
  4. p1.catch(console.log)
  5. // Promise { 123 }

  

 Promise.all(promises)   

  作用:传入promises数组,若promises全为fullfilled类型,返回类型为fullfilled,值为promises结果组成的数组。若有一个失败,则返回类型为rejected,值为按数组传入顺序第一个失败的promise的值

 

  1. let p1 = Promise.resolve("hello");
  2. let p2 = Promise.resolve("a");
  3. let p3 = Promise.resolve("b");
  4. Promise.all([p1,p2,p3]).then(console.log);
  5. // [ 'hello', 'a', 'b' ]
  6. p1 = Promise.resolve("hello");
  7. p2 = Promise.reject("a");
  8. p3 = Promise.reject("b");
  9. Promise.all([p1,p2,p3]).catch(console.log);
  10. // a

 

Promise.race(promises)   

  作用:传入promises数组,返还第一个改变状态的promise的状态与值

 

  1. let p1 = new Promise((resolve, reject) => {
  2. resolve("ok");
  3. })
  4. let p2 = Promise.resolve("a");
  5. let p3 = Promise.resolve("b");
  6. Promise.race([p1, p2, p3]).then(console.log);
  7. // ok
  8. p1 = new Promise((resolve, reject) => {
  9. setTimeout(() => {
  10. resolve("ok");
  11. }, 1000);
  12. })
  13. p2 = Promise.resolve("a");
  14. p3 = Promise.resolve("b");
  15. Promise.race([p1, p2, p3]).then(console.log);
  16. // a

 

then 方法:

  1. let p = Promise.resolve("ok");
  2. let p1 = p.then(value => {
  3. console.log(value);
  4. })
  5. console.log(p1);
  6. /**
  7. Promise {<pending>}
  8. __proto__: Promise
  9. [[PromiseState]]: "fulfilled"
  10. [[PromiseResult]]: undefined
  11. */
  12. let p = Promise.resolve("ok");
  13. let p1 = p.then(value => {
  14. throw("wrong")
  15. })
  16. console.log(p1)
  17. /**
  18. Promise {<rejected>: "wrong"}
  19. __proto__: Promise
  20. [[PromiseState]]: "rejected"
  21. [[PromiseResult]]: "wrong"
  22. */
  23. let p = Promise.resolve("ok");
  24. let p1 = p.then(value => {
  25. return "ok"
  26. })
  27. console.log(p1)
  28. /**
  29. Promise {<pending>}
  30. __proto__: Promise
  31. [[PromiseState]]: "fulfilled"
  32. [[PromiseResult]]: "ok"
  33. */
  34.  
  35. // 返回promise 则p1即为返回的promise 代码略

注意:

  1.利用then方法返回新的promise可以进行then的链式调用,链式调用中存在异常穿透,即只需在最后直接catch,即可捕获所有then中可能出现的异常

  2.中断promise.then的链式调用,在其中一个then中返还一个pending状态的promise即可, new Promise(() => {}); 

 

async & await:

  async: 修饰一个函数,根据返回值构建出一个Promise,规则同then

   await:只能在async修饰的函数中调用

    1.右侧值为fullfilled的promise对象,获得其值

    2.右侧值为rejected的promise对象,抛出错误

    3.右侧为值,直接返回该值

注意:

  1.promise中的方法在被创建时会被同步执行

  1. new Promise((resolve, reject) => {
  2. console.log(1);
  3. });
  4. console.log(2);
  5. // 输出: 1 2

 

        2.如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。

  1. new Promise((resolve,reject) => {
  2. throw "出错了"
  3. }).catch(console.log)
  4. // 出错了

 

原文链接:http://www.cnblogs.com/Mkkk/p/14395521.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号