关于Promise的返回值
根据MDN总结
Promise有三种状态:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
一旦Promise的任务处理完成(pending状态结束),Promise就处于fulfilled或rejected状态。
fulfilled时会执行resolve回调(通过Promise.prototype.then()
绑定);rejected会执行reject回调(通过Promise.prototype.catch()
或Promise.prototype.then()
绑定)。
一旦Promise的结果确定就不会再改变。所以Promise.prototype.then()
和Promise.prototype.catch()
始终返回新的Promise对象。
const p1 = new Promise((resolve, reject) => {
resolve('foo');
});
var p2 = p1.then((value) => {
console.log(value);
});
var p3 = p1.catch((value) => {
console.log(value);
});
console.log(p1 === p2);// false
console.log(p1 === p3);// false
console.log(p2 === p3);// false
Promise.prototype.then()
的返回值取决于其绑定的回调函数的返回值。
如果then()
的回调函数:
-
返回非Promise类型的值或没有返回:
then()
返回一个成功状态的Promise对象,并将回调函数的执行结果作为该Promise对象的resolve()
回调的入参。const p1 = new Promise((resolve, reject) => { resolve('foo'); }); var p2 = p1.then((value) => { return "bar"; }); p2.then((value) => { console.log(value); });
换句话说,回调函数的返回值是啥,下一个
then()
的入参就是啥。//这样看着更清楚 const p1 = new Promise((resolve, reject) => { resolve('foo'); }).then((value) => { return "bar"; }).then((value) => { console.log(value); });
-
抛出异常:
then()
返回一个失败状态的Promise对象,并将异常的错误信息作为该Promise对象的reject()
回调的入参。const p1 = new Promise((resolve, reject) => { resolve('foo'); }); var p2 = p1.then((value) => { throw "error error !"; }); p2.then((value) => { console.log("then "+value); }); p2.catch((value) => { console.log("catch "+value); })
换句话说,回调函数执行出错,后续的
then()
就不执行了,变成catch()
执行了。const p1 = new Promise((resolve, reject) => { resolve('foo'); }).then((value) => { throw "error error !"; }).then((value) => { console.log("then "+value);//不执行 }).catch((value) => { console.log("catch "+value); })
-
返回Promise类型的值:
then()
的回调函数返回Promise对象的话,then()
会返回同状态(pending、fulfilled、rejected)的新Promise对象。const p1 = new Promise((resolve, reject) => { resolve('foo'); }); let pInner; let p2 = p1.then((value) => { pInner = new Promise((resolve, reject) => { resolve('bar'); }); return pInner; }); console.log(p2 === pInner);//false
-
不执行:
then()
的回调函数不执行,则意味着该Promise对象是失败状态。即使是失败状态,then()
的回调函数不执行,then()
依然会返回新的Promise对象。const p1 = new Promise((resolve, reject) => { resolve('foo'); }); let p2 = p1.then((value) => { throw "error error !"; }); let p3 = p2.then((value) => { console.log("then "+value); }); console.log(p3 === p2);//false //虽然p3是新创建的Promise对象,但其错误信息依然保留。 p3.catch((value) => { console.log("catch "+value);//"catch error error !" })
Promise.prototype.catch()
也类似,实际上catch()
内部也调用了then()
。
如果catch()
的回调函数:
-
返回非Promise类型的值或没有返回:
同
then()
,创建一个成功状态的Promise对象。const p1 = new Promise((resolve, reject) => { reject('foo'); }); //p1失败,走catch var p2 = p1.catch((value) => { return "error error !"; }); //p2成功,走then,不走catch。 p2.then((value) => { console.log("then "+value); }); p2.catch((value) => { console.log("catch "+value);//不执行 })
-
抛出异常:
同
then()
,返回一个失败状态的Promise对象。const p1 = new Promise((resolve, reject) => { reject('foo'); }); //p1失败,走catch var p2 = p1.catch((value) => { throw "error error !"; }); //p2失败,不走then,走catch。 p2.then((value) => { console.log("then "+value);//不执行 }); p2.catch((value) => { console.log("catch "+value); })
-
返回Promise类型的值:
同
then()
。 -
不执行:
同
then()
。