当前位置:   article > 正文

promise的原理和几种使用方法_promise原理

promise原理
  1. promise概念

    Promise异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果,其实是一个构造函数,自己身上有all、reject、resolve,race这几个方法,原型上有then、catch,finally等方法。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

  2. promise.prototytype.then():promise实例状态改变的回调函数,有两个参数:第一个是成功回调函数,第二个是失败回调函数。他会返回一个全新的promise,因此可以继续then链式调用。

  3. promise.prototype.catch():失败回调函数,状态变为rejected执行。相当于promise. prototytype.then(null/undifined,rejection),如果promise内发生了错误,但却没有定义catch(),这时运行到这一行代码会报错,但是不会影响到promise后面代码的执行

promise的几种方法:

1.基础用法:

  1. new Promise((resolve, reject) => {
  2. // resolve 成功的回调
  3. // reject 失败的回调
  4. // 成功或者失败只能存在一种状态,不能同事执行两个状态
  5. resolve('成功')
  6. reject('失败')
  7. // then 是获取Promise的resolve, reject状态
  8. }).then(res => {
  9. // 成功
  10. console.log(res);
  11. }, error => {
  12. // 失败
  13. console.log(error);
  14. })

2.promise.finally():promise实例无论状态是什么都会执行的函数,finally不接受任何参数。

  1. const p1 = function () {
  2. return new Promise((resolve, reject) =>{
  3. // 失败时
  4. // reject("失败了")
  5. // resolve(2);
  6. // 成功时
  7. resolve(2)
  8. reject("失败了")
  9. });
  10. };
  11. p1().then(res=> {
  12. console.log(res);
  13. }).catch(error=>{
  14. console.log(error);
  15. }).finally(()=>{
  16. console.log('无论失败或者成功都会走这个函数');
  17. })

3.promise.all():将多个promise实例包装成一个新的promise实例

  1. const p1 = function () {
  2. return new Promise((resolve, reject)=>{
  3. resolve(1);
  4. });
  5. };
  6. const p2 = function () {
  7. return new Promise((resolve, reject)=>{
  8. resolve(2);
  9. });
  10. };
  11. const p3 = function () {
  12. return new Promise((resolve, reject)=>{
  13. // reject("失败了")
  14. resolve(3);
  15. });
  16. };
  17. // Promise.all 所有封装的Promise都成功才会成功,只要有一个失败就会失败
  18. let result = Promise.all([p1(), p2(), p3()]).then(results=>{
  19. console.log(results);//[1, 2, 3]
  20. }).catch(error=>{
  21. console.log(err);
  22. // 当p3的reject("失败了")被解开时控制台会打印失败了
  23. })

4.promise.race():

  1. // race() 把多个封装的promise 组合起来,看谁跑的快
  2. const p1 = function () {
  3. return new Promise((resolve, reject)=>{
  4. setTimeout(() => {
  5. resolve(1);
  6. }, 500)
  7. });
  8. };
  9. const p2 = function () {
  10. return new Promise((resolve, reject)=>{
  11. setTimeout(() => {
  12. resolve(2);
  13. }, 400)
  14. });
  15. };
  16. const p3 = function () {
  17. return new Promise((resolve, reject)=>{
  18. setTimeout(() => {
  19. resolve(3);
  20. }, 600)
  21. });
  22. };
  23. //谁先执行完成就先执行回调,其余的将不会再进入race的任何回调,其余的没有停止,自行执行
  24. let result = Promise.race([p1(), p2(), p3()]).then(results=>{
  25. console.log(results);
  26. }).catch(error=>{
  27. console.log(error);
  28. })

5.promise.any():

  1. // 1. 只要有一个实例变成fulfilled,他就会变成fulfilled
  2. // 2. 只有全部实例状态都变成rejected,它才会变成rejected
  3. const p1 = function () {
  4. return new Promise((resolve, reject)=>{
  5. resolve(5);
  6. });
  7. };
  8. const p2 = function () {
  9. return new Promise((resolve, reject)=>{
  10. reject(2);
  11. });
  12. };
  13. const p3 = function () {
  14. return new Promise((resolve, reject)=>{
  15. resolve(3);
  16. });
  17. };
  18. let result = Promise.any([p1(), p2(), p3()]).then(results=>{
  19. console.log(results);
  20. // 5 因为p1成功了,只返回找到的第一个成功的,遇到reject会继续向下寻找
  21. }).catch(error=>{
  22. console.log(error);
  23. // 当三个return返回的都是reject时,控制台打印AggregateError: All promises were rejected
  24. })

6.promise.allSettled():等所有实例都返回结果,他的状态就只会变成fulfilled

  1. const p1 = function () {
  2. return new Promise((resolve, reject) => {
  3. resolve(1);
  4. });
  5. };
  6. const p2 = function () {
  7. return new Promise((resolve, reject) => {
  8. resolve(2);
  9. });
  10. };
  11. const p3 = function () {
  12. return new Promise((resolve, reject) => {
  13. reject(3);
  14. });
  15. };
  16. // Promise.allSettled无论成功或者失败会把所有的状态返回给results
  17. // 没有catch
  18. let result = Promise.allSettled([p1(), p2(), p3()]).then(results => {
  19. console.log(results);
  20. })

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/876461
推荐阅读
相关标签
  

闽ICP备14008679号