关于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()。

浙公网安备 33010602011771号