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()一次,都能按情况执行下去吗
回答:
你的理解是对的,以下是补充说明:
- Promise一直是pending的状态,只有当调用resolve或者reject方法之后,状态才会改变,这时候才会根据,是成功还是失败的状态去执行相应的回调函数,即,then,catch的回调
- then,catch返回的还是一个Promise的实例,所以,后续能够一直继续调用Promise的原型上的then(),catch()方法
那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