主题
async/await
async/await 和 Promise
async/await
是一个更直观的方式来处理 Promise,它使异步代码看起来更像同步代码,提高了代码的可读性。可以使用 async
函数来包装异步操作,然后使用 await
来等待 Promise 的解决或拒绝。
js
async function fetchData() {
try {
const result = await asyncTask()
// 处理结果
} catch (error) {
// 处理错误
}
}
当使用 async 函数时,函数内部的错误处理和 Promise 状态的控制是非常重要的。
默认情况下,async 函数会返回一个已解决(resolved)状态的 Promise,除非在函数内部显式抛出错误,此时将返回一个已拒绝(rejected)状态的 Promise,拒绝原因就是抛出的错误。这为异步操作的错误处理提供了一种便捷的方式。
js
async function asyncFunction() {
return Promise.resolve('Something went wrong')
}
asyncFunction().catch(error => {
console.error(error.message) // 输出: "Something went wrong"
})
提示
虽然 throw new Error()
会导致返回一个 rejected
状态的 Promise,但是需要注意:
throw new Error()
适合 同步 代码中,用于立即中断当前执行并抛出异常,适用于同步函数内的错误。Promise.reject()
更适合于 异步 错误处理,尤其是在像 Axios 这样的异步请求中,因为它能够让错误沿着 Promise 链传递,便于统一错误处理,且不会中断异步流程。
且如果直接抛出错误,异常会在请求拦截器中中断并且可能无法被外部捕获。还需要在其他地方使用 try...catch
来处理这个异常,这可能会增加代码的复杂度。
对比示例
js
function test(num) {
return new Promise((resolve, reject) => {
if (num > 10) {
resolve('resolve')
} else {
reject('reject')
}
})
}
;(() => {
test(12)
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
.finally(() => {
console.log('finally')
})
})()
js
async function test(num) {
if (num > 10) {
return 'resolve'
} else {
return Promise.reject('reject')
}
}
;(async () => {
try {
const res = await test(12)
console.log(res)
} catch (err) {
console.log(err.message)
} finally {
console.log('finally')
}
})()