自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不要一直使用try-catch啦!三種async/await錯(cuò)誤捕獲方式

開發(fā) 前端
async + await? 可以讓 異步的操作擁有同步的寫法。所以在日常開發(fā)中,通過 async + await 來處理異步編程(比如:接口請(qǐng)求)是非常常見的一種方案。

Hello,大家好,我是 Sunday。

async + await 可以讓 異步的操作擁有同步的寫法。所以在日常開發(fā)中,通過 async + await 來處理異步編程(比如:接口請(qǐng)求)是非常常見的一種方案。

但是,只要是異步操作,那么就會(huì)存在出現(xiàn) 錯(cuò)誤 的可能。當(dāng) promise 出現(xiàn)錯(cuò)誤時(shí),我們可以直接通過 .catch 的方式進(jìn)行捕獲,那么 async + await 應(yīng)該怎么做呢?每次都使用 try-catch 進(jìn)行完整的包裹嗎?有沒有更好地方案呢?

今天這篇文章,咱們就來說下這個(gè)問題~

01:使用 try/catch 進(jìn)行捕獲

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('請(qǐng)求出現(xiàn)錯(cuò)誤')
         }, 1000)
     })
}

async function loggedIn() {
     try {
         // 執(zhí)行中斷
         let userInfo = await getUserInfo()
         console.log('不會(huì)繼續(xù)執(zhí)行')
     } catch(e) {
         console.log(e)
     }
}
loggedIn()

上面的代碼在執(zhí)行時(shí),會(huì)通過 try-catch 捕獲到“請(qǐng)求異?!辈⒅袛鄨?zhí)行g(shù)etUserInfo。這也是日常開發(fā)中常見處理方式。

但是如果我們存在多次的請(qǐng)求,就必須要通過多次的 try-catch 進(jìn)行捕獲,特別是在請(qǐng)求需要具備連續(xù)性的時(shí)候:

async function loggedIn() {
     try {
         let userInfo = await getUserInfo()
         console.log('不會(huì)繼續(xù)執(zhí)行')
         let pageInfo = await getPageInfo(userInfo?.userId)
     } catch(e) {
         console.warn(e)
     }
}
loggedIn()

這樣的處理,在當(dāng)前場(chǎng)景下并沒有什么問題,但是如果每一個(gè)接口的請(qǐng)求都這么進(jìn)行調(diào)用,那么就會(huì)顯得冗余了。所以,我們就可以延伸出一些其他的處理方案。

02:直接捕獲

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('請(qǐng)求出現(xiàn)錯(cuò)誤')
         }, 1000)
     })
}

async function loggedIn() {
     let userInfo = await getUserInfo().catch(e => console.log(e))
     console.log('程序會(huì)繼續(xù)執(zhí)行')
     if (!userInfo) return
     let pageInfo = await getPageInfo(userInfo?.userId)
}
loggedIn()

在上面的代碼中,我們通過 catch捕獲了異常,但程序會(huì)繼續(xù)執(zhí)行,所以我們只需要在后續(xù)進(jìn)行 if 判斷,從而完成連續(xù)的邏輯。

如果你不希望程序繼續(xù)執(zhí)行,那么可以按照下面的方式進(jìn)行處理

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('請(qǐng)求出現(xiàn)錯(cuò)誤')
         }, 1000)
     })
}

async function loggedIn() {
     let userInfo = await getUserInfo().catch(e => {
         console.log(e)
         return Promise.reject(e)
     })
     console.log('程序不會(huì)繼續(xù)執(zhí)行')
     let pageInfo = await getPageInfo(userInfo?.userId)
}
loggedIn()

這種方式會(huì)執(zhí)行通過 在catch塊中的Promise.reject(e)來中斷執(zhí)行。

如何選擇?

1、如果錯(cuò)誤不需要中斷程序執(zhí)行,那么可以使用如下方式

let userInfo = await getUserInfo().catch(e => console.log(e))
if (!userInfo) return

2、如果發(fā)生錯(cuò)誤時(shí)需要中斷,并且通過控制臺(tái)明確一個(gè)統(tǒng)一的錯(cuò)誤

try {
   let userInfo = await getUserInfo()
   console.log('不會(huì)繼續(xù)執(zhí)行')
   let pageInfo = await getPageInfo(userInfo?.userId)
} catch(e) {
   console.warn(e)
}

3、如果發(fā)生錯(cuò)誤時(shí)需要中斷,但是不需要控制臺(tái)顯示統(tǒng)一的錯(cuò)誤

let userInfo = await getUserInfo().catch(e => {
   console.log(e)
   return Promise.reject(e)
})
console.log('程序不會(huì)繼續(xù)執(zhí)行')
let pageInfo = await getPageInfo(userInfo?.userId)
責(zé)任編輯:武曉燕 來源: 程序員Sunday
相關(guān)推薦

2017-11-02 15:26:10

JavaScriptasync錯(cuò)誤

2020-09-27 07:48:40

不用try catch

2025-04-29 08:05:00

JavaScript錯(cuò)誤處理開發(fā)

2009-07-21 14:30:38

Scalatry-catch

2024-05-24 08:59:15

2024-06-25 10:37:11

2025-01-16 12:00:00

try-catchfor循環(huán)

2024-11-04 08:20:00

try-catch編程

2024-12-30 08:22:35

2024-05-07 07:58:47

C#程序類型

2024-11-11 11:33:57

2024-03-05 18:15:28

AsyncAwait前端

2025-02-12 12:00:00

前端try-catchJavaScrip

2021-01-05 07:54:55

事項(xiàng)trycatch

2020-05-29 08:14:49

代碼Try-Catch程序員

2024-12-02 11:07:24

Java代碼機(jī)制

2021-11-26 11:07:14

cowsay命令Linux

2020-10-14 12:10:22

Javatry-catch代碼

2022-01-25 12:14:39

面試try-catch代碼

2012-07-22 15:59:42

Silverlight
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)