美文网首页编程学习笔记
【promise-03】 处理错误

【promise-03】 处理错误

作者: 飞蝗tengda | 来源:发表于2018-12-15 21:51 被阅读0次

    #Promise - 处理错误

    首先要知道,then(resolve,reject)中的两个方法都是异步的,所以try... catch是没有用的。

    Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,它们是两个函数

    我们先写一个方法

    function f(val) {
      return new Promise((resolve, reject) => {
        if (val) {
          resolve({ name: '小明' }); //成功的时候要做的事情
        } else {
          reject('404'); //失败的时候要做的事情
        }
      }); 
    }
    
    
    • 处理错误的第一种方式是then中的第二个参数reject,对应的是失败的时候做的事情。

    then方法可以接受两个回调函数作为参数,第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用,其中,第二个函数是可选的,不一定要提供

    // then(resolve, reject)
    // then方法中的第二个回调 失败时候做的事
    
    f(false)
    //这里的参数data是resolve传递过来的值"{ name: '小明' }"
     //要注意的是resolve只能传递一个参数
       .then((data) => {      console.log(data)
        }, e => {
    //这里的参数e是reject传递过来的值'404'
         console.log(e); 
    })
    
    • 第二个方式 .catch方法

    Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。

    f(true)
      .then(data => {
        console.log(data);
        return f(false);
      })
      .then(() => {
        console.log('我永远不会被输出'); //这里then中成功的方法不被执行,因为这里没有reject方法,即没有对失败的处理,而之前返回的promise是失败,它就会继续往下走
      })
      .then(() => {
      },e=>console.log('失败'))//相反,如果处理了,之后的catch就不会(不捕获错误)运行了
      .catch(e => {
        console.log(e);
        return f(false) ; 
      });
    

    如果.catch还是return一个false,那还要一个catch去捕获,这就造成一个无限catch的可能,目前es6的标准中没有一个很好的解决方案。

    • 第三个方式.finally方法
    // finally
    // 不论成功还是失败 finally中的内容一定会执行
    
    f(true)
      .then(data => {
        console.log(data);
        return f(false);
      })
      .catch(e => {
        console.log(e);
        return f(false);
      })
      .finally(() => {
        console.log(100);
      });
    

    我们可以用finally来做一些收尾的工作。

    相关文章

      网友评论

        本文标题:【promise-03】 处理错误

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