then 和 catch 只要不报错,返回的都是一个fullfilled状态的promise

发布于 2022-09-13 00:44:51 字数 762 浏览 22 评论 0

关于这句话的理解,这样子理解对吗?

Promise.resolve()
  .then(() => {
    console.log(1); //打印1
    throw new Error("error"); //抛错,走catch()
  })
  .catch(() => {
    console.log(2); //打印2 未抛错,返回一个fullfilled的promise  继续走then()
  })
  .then(() => {
    console.log(3); //打印3  返回一个fullfilled的promise
  });
Promise.resolve()
  .then(() => {
    console.log(1); //打印1
    throw new Error("error"); //抛错,走catch()
  })
  .catch(() => {
    console.log(2); //打印2 抛错,返回一个rejected的promise  继续走catch()
    throw new Error("error");
  })
  .catch(() => {
    console.log(3); //打印3  未抛错,返回一个fullfilled的promise
  });

还有就是后面所有的的then(),catch,只要promise执行resolve()或reject()一次,都能按情况执行下去吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小帐篷 2022-09-20 00:44:51

你的理解是对的,以下是补充说明:

  1. Promise一直是pending的状态,只有当调用resolve或者reject方法之后,状态才会改变,这时候才会根据,是成功还是失败的状态去执行相应的回调函数,即,then,catch的回调
  2. then,catch返回的还是一个Promise的实例,所以,后续能够一直继续调用Promise的原型上的then(),catch()方法
  3. 那then,catch方法返回的promise的状态到底是失败还是成功?这里首先说明一下,catch()方法的实现,其实是基于then()的基础上,把then的第一个回调函数设置为undefined。因为then的第二个参数回调函数就是捕获错误的。具体源码大致实现如下:

    class MyPromise {
      constructor(executor){...}
      then(){...}
      catch(failCallBack) { 
      // 相当于then()第一个参数是undefined
     return this.then(undefined, failCallBack); 
      }
    }

    所以,这里我们具体分析一下,then()执行完,后续怎么知道它返回的是rejected的promise还是fullfilled的promise?这里看具体源码大致实现,这里参考:https://segmentfault.com/a/11...
    总结一下:
    (1).then()方法的成功或者失败回调函数,只要里面throw错误,得到的就是一个rejected的promise。
    (2).then()方法的成功或者失败回调函数,执行得到的结果是一个非promise的普通值,那then()方法执行完得到的就是一个fullfilled的promise
    (3).then()方法的成功或者失败回调函数,执行得到的返回结果还是一个promise,那就根据返回的promise的状态而决定,返回的到底是fullfilled还是rejected的promise
    例子

    const a = new Promise((resolve, reject) => {
      setTimeout(() => {
     resolve("111");
      }, 1000);
    });
    const b = new Promise((resolve, reject) => {
      setTimeout(() => {
     //resolve("222");
     reject("333");
      }, 1000);
    });
    a.then(() => {
      return b;
    }).then(
      (value) => {
     console.log(value, "value");
      },
      (reason) => {
     console.log(reason, "reason");
      }
    );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文