编程学习笔记

【promise-03】 处理错误

2018-12-15  本文已影响0人  飞蝗tengda

#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方法可以接受两个回调函数作为参数,第一个回调函数是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); 
})

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中的内容一定会执行

f(true)
  .then(data => {
    console.log(data);
    return f(false);
  })
  .catch(e => {
    console.log(e);
    return f(false);
  })
  .finally(() => {
    console.log(100);
  });

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

上一篇下一篇

猜你喜欢

热点阅读