成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

Hello,大家好,我是 Sunday。

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

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

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

01:使用 try/catch 進行捕獲

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('請求出現錯誤')
         }, 1000)
     })
}

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

上面的代碼在執行時,會通過 try-catch 捕獲到“請求異常”并中斷執行getUserInfo。這也是日常開發中常見處理方式。

但是如果我們存在多次的請求,就必須要通過多次的 try-catch 進行捕獲,特別是在請求需要具備連續性的時候:

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

這樣的處理,在當前場景下并沒有什么問題,但是如果每一個接口的請求都這么進行調用,那么就會顯得冗余了。所以,我們就可以延伸出一些其他的處理方案。

02:直接捕獲

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('請求出現錯誤')
         }, 1000)
     })
}

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

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

如果你不希望程序繼續執行,那么可以按照下面的方式進行處理

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('請求出現錯誤')
         }, 1000)
     })
}

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

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

如何選擇?

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

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

2、如果發生錯誤時需要中斷,并且通過控制臺明確一個統一的錯誤

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

3、如果發生錯誤時需要中斷,但是不需要控制臺顯示統一的錯誤

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

2017-11-02 15:26:10

JavaScriptasync錯誤

2025-06-25 08:15:00

JavaScrip異步編程代碼

2020-09-27 07:48:40

不用try catch

2025-04-29 08:05:00

JavaScript錯誤處理開發

2009-07-21 14:30:38

Scalatry-catch

2024-06-25 10:37:11

2024-05-24 08:59:15

2025-01-16 12:00:00

try-catchfor循環

2024-12-30 08:22:35

2024-11-04 08:20:00

try-catch編程

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

事項trycatch

2021-11-26 11:07:14

cowsay命令Linux

2020-05-29 08:14:49

代碼Try-Catch程序員

2024-12-02 11:07:24

Java代碼機制

2020-10-14 12:10:22

Javatry-catch代碼

2022-01-25 12:14:39

面試try-catch代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级片视频免费观看 | 免费久久精品 | 精品国产免费一区二区三区演员表 | 看特级黄色片 | 日本一区二区三区四区 | 成人免费观看视频 | 国产女人与拘做受视频 | 日日干干 | 久久久99国产精品免费 | 欧美男人天堂 | 欧美性猛交| 91午夜在线 | 最新免费视频 | 影音先锋中文在线 | 99热在线播放 | 91.com在线观看 | 日韩高清中文字幕 | 午夜视频免费在线观看 | 日韩视频区 | 亚洲国产成人久久久 | 欧美成人免费在线 | 久草视 | 成人免费一级视频 | 欧美片网站免费 | 中文字幕日韩欧美 | 欧美久久久久久 | 天天夜天天操 | 亚洲视频免费一区 | 国产高清在线精品一区二区三区 | 久久久久免费精品国产 | 国产一区二区在线免费观看 | 好姑娘影视在线观看高清 | 一区二区三区四区五区在线视频 | 黄色欧美在线 | 久久久久久国模大尺度人体 | 亚洲精品日韩综合观看成人91 | 精品久久久久久亚洲精品 | 日韩在线观看一区 | 欧美精品欧美精品系列 | 日韩亚洲视频 | 日韩一级二级片 |