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

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

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

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()一次,都能按情况执行下去吗


回答:

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

  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");

    }

    );

以上是 then 和 catch 只要不报错,返回的都是一个fullfilled状态的promise 的全部内容, 来源链接: utcz.com/p/935776.html

回到顶部