美文网首页
对Promise中的resolve,reject,catch的理

对Promise中的resolve,reject,catch的理

作者: 风不会停7 | 来源:发表于2018-11-05 10:05 被阅读21次

    .then()的时候到底是在then什么…
    首先要理解…Promise是一个对象,有then()方法的对象
    then()的入参是一个函数,通常在promise链中,入参是 一个返回promise的函数 ,这句话好像有点拗口,就是说入参是一个函数,这个函数会return一个promise对象。

    如何破坏promise链

    如果有这样一个promise链:

    p1().then(p2).then(p3)
      .then((data) => {
        console.log('data: ' + data);
      })
      .catch((error) => {
        console.log('error: ' + error);
      });
     
    function p1() {
      let p1 = new Promise((resolve, reject) => {
        console.log('p1 resolved');
        resolve(123);
      });
      return p1;
    }
     
    function p2() {
      let p2 = new Promise((resolve, reject) => {
        console.log('p2 rejected');
        reject(456);
      });
      return p2;
    }
     
    function p3() {
      let p3 = new Promise((resolve, reject) => {
        console.log('p3 resolved');
        resolve(789);
      });
      return p3;
    }
    

    上面这个例子,你看到的console.log会是这样:

    p1 resolved
    p2 rejected
    error: 456
    

    并没有看到 p3 的log,而是看到了error message,也就是说:
    在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法,通过 .catch 能够清楚的判断出promise链在哪个环节出了问题。

    //注意
    let p = new Promise((resolve, reject) => {
        let result = 123;
        reject(result);
    })
    // 只会被第一种方式reject操作失败的结果
    p.then((result)=>{ 
        console.log('success:',result);
    }, (result)=>{ 
        console.log('fail:',result);
    }).then(() => {
        console.log(456);
    }).catch((result)=>{ 
        console.log('error:',result);
    })
    //输出结果
    // "fail: 123"
    // "456"
    

    非Promise链中reject不会影响后面.then()的执行,并且如果reject和catch两种方式同时使用的话,只会被第一种方式reject操作失败的结果。

    相关文章

      网友评论

          本文标题:对Promise中的resolve,reject,catch的理

          本文链接:https://www.haomeiwen.com/subject/iqbjxqtx.html