关于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()的回调函数:

  1. 返回非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);
    });
    
  2. 抛出异常:

    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);
    })
    
  3. 返回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
    
  4. 不执行:

    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()的回调函数:

  1. 返回非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);//不执行
    })
    
  2. 抛出异常:

    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);
    })
    
  3. 返回Promise类型的值:

    then()

  4. 不执行:

    then()

posted @ 2022-02-15 17:30  嘘,别吵  阅读(620)  评论(0编辑  收藏  举报