promise是es6的一个对象
它用来描述一个异步操作的结果值拥有三个状态
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
它通过.then()方法来处理结果,处理结果后,仍然返回一个promise对象
const pa = new Promise((re, je) => {
// re("成功");
je("gg");
})
.then((value) => {
console.log("我是value", value); // gg
})
.then(
(res) => {
console.log("我是res", res); // undefined
},
(rej) => {
console.log("我是rej", rej); // 不会走
}
);
ps:
-
fulfilled/reject;当一个promise对象被 resolve/reject 后。
-
pending ;当一个promise对象还未被 resolve/reject 时。
-
promise.resolve 之后返回的内容由什么决定? 返回给定value决定的Promise对象。换句话说,promise的细分内容时由这个value决定的。那value都有什么类型的值呢?
3.1 thenable(即,带有then方法的对象),返回的值由then方法决定
3.2 否则的话(该返回值为 空,基本类型,不带then方法的对象),返回一个接受状态的promise对象。并且将该value传递给对应的then方法。 -
promise then的返回值
then是默认返回Promise对象的,但是也可以手动return内容。return不同的内容由不同的效果。
简单来说,添加解决(fulfillment)和拒绝(rejection)回调到当前 promise, 返回一个新的 promise, 将以回调的返回值来resolve.
(这两句话是关键,但是其实翻译的挺不是人的。意思是then的返回值是一个promise对象,但是promise如果每调用resolve方法的,后续的then回调方法是不会被触发的。所以目前这个then的返回值,就是会被用来当做返回的那个promise的resolve的入参。
4.1 return 一个【值】,那么会返回一个接受状态的Promise对象,这个【值】会成为对应then方法的回调参数值。
4.2 不 return 任何内容,那么会返回一个接受状态的Promise对象,对应then方法的回调参数值为undefined。
4.3 抛出一个错误,那么会返回一个拒绝状态的Promise对象,对应的拒绝状态的回调函数的参数值为被抛出的错误。
4.4 return 一个 接受状态的Promise,那么会返回一个接受状态的promise对象,并且这个Promise的接受状态的回调函数(resolve)的参数将作为被返回的那个Promise对象的resolve回调函数的参数。
4.5 同上文,如果return一个拒绝状态的Promise,那么将接受状态的操作换成拒绝状态即可。
4.6 return 一个 未定状态(pending)的Promise,那么返回的Promise状态也是未定的,并且后者的终态与前者相同;并且,它变为终态时的回调函数与参数,和前者的相同。resolve 与 then的返回值的区别
1.前者返回的内容与 resolve的【参数值】有关,不带then的值都是接受状态,带then的一律看then的返回内容;而后者则是只根据then的返回内容来决定其返回的Promise对象的状态和参数。
2.对比来看,前者是依赖后者的规则。后者返回的Promise的状态是最全的,有三种,而前者只有一种,是接受状态。但是
有些浏览器会把状态写作 ,但表达的意思都是一样的。因此,有些关于 为什么要同时存在他们二者的争论 ,其实毫无意义。因为 resolved(已决议)包含 settled 和 锁定(依赖的另一个 promise 的状态被"锁定"了)。而settled(已敲定) 包含 <resolve,reject>。