<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家平時如果使用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
方法。
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
已經幫我們做了這件事,我們可以看看它是怎麼做的,它的原始碼只有短短十幾行,我們應該讀讀它的原始碼,學學它的思想
/** * @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處理錯誤的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45