使用async await處理錯誤方法示例
Promise封裝請求
大傢平時如果使用Promise
封裝請求,那麼當你使用這個請求函數的時候是這樣的:
// 封裝請求函數 const request = (url, params) => { return new Promise((resolve, reject) => { // ...do something }) } // 使用時 const handleLogin = () => { request( '/basic/login', { usename: 'sunshine', password: '123456' } ).then(res => { // success do something }).catch(err => { // fail do something }) }
可以看到,當你的請求成功時,會調用then
方法,當你的請求失敗時會調用catch
方法。
async/await
Promise
的出現解決瞭很多問題,但是如果請求多瞭且有順序要求的話,難免又會出現嵌套的問題,可讀性較差,比如:
const handleLogin = () => { request( '/basic/login', { usename: 'sunshine', password: '123456' } ).then(res => { // 登錄成功後獲取用戶信息 request( '/basic/getuserinfo', res.id ).then(info => { this.userInfo = info }).catch() }).catch(err => { // fail do something })
所以這個時候async/await
出現瞭,他的作用是:用同步的方式執行異步操作,上面的代碼使用async/await
的話可以改寫成:
const handleLogin = async () => { const res = await request('/basic/login', { usename: 'sunshine', password: '123456' }) const info = await request('/basic/getuserinfo', { id: res.id }) this.userInfo = info }
這樣的話代碼的可讀性比較高,而不會出現剛剛的嵌套問題,但是現在又有一個問題瞭,Promise有catch
這個錯誤回調來保證請求錯誤後該做什麼操作,但是async/await
該如何捕獲錯誤呢?
await-to-js
其實已經有一個庫await-to-js
已經幫我們做瞭這件事,我們可以看看它是怎麼做的,它的源碼隻有短短十幾行,我們應該讀讀它的源碼,學學它的思想
源碼很簡單
/** * @param { Promise } 傳進去的請求函數 * @param { Object= } errorExt - 拓展錯誤對象 * @return { Promise } 返回一個Promise */ export function to( promise, errorExt ) { return promise .then(data => [null, data]) .catch(err => { if (errorExt) { const parsedError = Object.assign({}, err, errorExt) return [parsedError, undefined] } return [err, undefined] }) } export default to
源碼總結:to
函數返回一個Promise且值是一個數組,數組之中有兩個元素,如果索引為0
的元素不為空值,說明該請求報錯,如果索引0
的元素為空值說明該請求沒有報錯,也就是成功。
使用很簡單
我們該怎麼去使用這個to
函數呢?其實很簡單,還是剛剛的例子
const handleLogin = async () => { const [resErr, res] = await to(request('/basic/login', { usename: 'sunshine', password: '123456' })) if (resErr) { // fail do somthing return } const [userErr, info] = await to(request('/basic/getuserinfo', { id: res.id })) if (userErr) { // fail do somthing return } this.userInfo = info }
所以說,偶爾看看一些庫的源碼,還是能學到東西的!!!
以上就是使用async await處理錯誤方法示例的詳細內容,更多關於async await處理錯誤的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- JS中如何優雅的使用async await詳解
- Vue中如何優雅的捕獲 Promise 異常詳解
- await-to-js源碼深入理解處理異步任務用法示例
- 代碼規范需要防微杜漸code review6個小錯誤糾正
- 前端常見面試題之async/await和promise的區別