1. then()方法
then是Promise构造函数的实例方法。第一个参数是成功状态的回调函数,第二个参数是失败状态的回调函数。
new Promise((resolve, reject) => {
reject('error')
}).then(data => {
console.log(data)
}, error => {
console.log(error) // error
})
2. catch()方法
catch是Promise构造函数的实例方法。实际上是对then方法的简写,第一个参数为null,第二个参数则是错误处理的回调。
以下两行代码是等价的:
promise.then(null, c);
promise.catch(c);
3. 异常处理
首先Promise实例之所以能够链式调用,是因为它的每个方法都返回的是对象本身(如:then方法返回的就是Promise实例)。
3.1 then()方法的第二个参数
new Promise((resolve, reject) => {
reject('error')
}).then(data => {
console.log(data)
}, error => {
console.log('then', error) // then error
}).catch( error => {
console.log('catch', error)
})
示例中的catch没有执行的原因:
catch的回调只有在上一环的回调抛出错误时才会被调用。如果该回调正常返回,那么catch就会被跳过。例中,第一个then并没有抛出错误,则catch就会被跳过。
3.2 catch()方法
这是一种常用的异常处理做法,因为这样不仅可以处理Promise中的错误,而且还会处理第一个then中成功回调函数的异常。
new Promise((resolve, reject) => {
reject('error')
}).then(data => {
console.log(data)
}).catch( error => {
console.log('catch', error) // catch error
})
示例中的catch执行的原因:
如果then()中没有失败回调函数,则会执行catch()。没有给then传递处理失败状态的回调函数,那么这个then会以同一个错误对象被拒绝,返回一个失败状态的Promise实例,直到被处理。
4. async…await函数中异常处理
await是一个接收Promise并将其转换为一个返回值,或一个抛出的异常的关键字,配合async使用。
4.1 使用 try...catch异常处理(常用做法)
async function a1() {
const p1 = new Promise((resolve, reject) => {
reject('error')
})
try {
await p1
} catch (err) {
console.log('err', err) // err error
}
}
a1()
如上代码,每一次的await语句都要进行一次try...catch的异常捕获,那么可以考虑封装一个方法来处理。
github别人封装好的库:await-to-js(Async await wrapper for easy error handling)
示例代码:
function to(promise) {
return promise
.then(data => [null, data])
.catch(error => [error, null])
}
async function a1() {
const p1 = new Promise((resolve, reject) => {
reject('error')
})
const [error, data] = await to(p1)
if (error) {
console.log('err', error) // err error
}
}
a1()
4.2 使用Promise构造函数的实例方法catch()异常处理
一般不常用
async function a1() {
const p1 = new Promise((resolve, reject) => {
reject('error')
})
await p1.catch(e => console.log('error', e)) // error error
}
a1()