#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来做一些收尾的工作。
网友评论