美文网首页编程学习笔记
【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