promise错误处理的三种方法
promise碰到then,也就是resolve或者reject的时候是异步的,所以try...catch对它是没有用的
1、then(resolve,reject); then方法中第二个回调,是失败时候做的失败时候做的事
function f(val){ return new Promise((resolve,reject) => { if(val){ resolve({ name:'小明' },100); //成功时也可以传递一个值,但需要注意的是只能传递一个参数,传两个的话第二个参数是拿不到的 }else{ reject('404'); //错误处理的第一种方式:传递参数,错误的原因 } }); } //then(resolve,reject),碰到resolve或是reject都是异步的,所以tr catch对它是没有用的 //then方法中的第二个回调reject,是失败时候做的事 f(false) .then( (data, data2) => { console.log(data2); //undefined }, e => { console.log(e); //404 })
//需要注意的是只能传递一个参数,如果传递了两个参数,第二个参数是拿不到的,data2会为undefined
f(true)
.then( (data,data2) => {
console.log(data2); //打印结果为undefined
},e => {
console.log(e);
})
2、使用catch捕获错误
function f(val){ return new Promise((resolve,reject) => { if(val){ resolve({ name:'小明' }); }else{ reject('404'); } }); } f(true) .then(data => { console.log(data); //{name:'小明'} return f(false); //返回的promise是失败的话,后面的then对这个失败没有处理的话,就会继续往下走 }) .then(() => { console.log('我永远不会被输出') }) .then(() => { }, e => console.log('失败')) // .catch(e => { //上面处理了错误的话,这个catch就不会运行了 console.log(e); //404 }) .then( () => { //catch后面可以继续then,但是如果后面的then出错了,跟上一个catch就没有关系了 console.log(e) return f(false) }) .catch() //如果最后一个catch有错误,会无限catch //标准es中,这个问题没有很好地解决方法,但是第三方的库有对全局的捕获
3、finally捕获
//finally //不论成功还是失败,finally中的内容一定会执行 //可以在finally中做一些收尾的工作 function f(val){ return new Promise((resolve,reject) => { if(val){ resolve({ name:'小明' }); }else{ reject('404'); } }); } f(true) .then(data => { console.log(data); //{name:'小明'} return f(false); }) .catch(e => { console.log(e) //404 return f(false); //即便返回了一个成功的promise,下面的finally也会执行,如果返回的是失败的promise,控制台最后一行会报错uncaught (in promise) 404 }) .finally( () => { console.log(100) //100 })