Предисловие

При написании асинхронных функций очень распространены как обещания, так и асинхронные решения. Даже в одном проекте разные разработчики используют разные привычки. Тем не менее, сравнение между ними не является предметом этой статьи. Его можно обобщить только одним предложением: «асинхронность — это идеальное решение для асинхронного программирования».

При использовании асинхронной функции во многих статьях говорится, что рекомендуется try catch ловить исключения, но на самом деле я читал коды многих проектов, и коды строго не соблюдаются. Многие из них бесполезны, и даже функция catch не написана. Почему это? ?

Давайте сначала посмотрим на пример кода в случае использования try catch:

Пример 1: Использование try-catch

function getUserInfo () {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
                 reject('request exception')
         }, 1000)
     })
}

async function logined() {
     try {
         let userInfo = await getUserInfo()
         // execute interrupt
         let pageInfo = await getPageInfo(userInfo?.userId)
     } catch(e) {
         console. warn(e)
     }
}
logined()

После выполнения он будет захвачен в catch request exception, а затем функция getUserInfo прервет выполнение, что логично. Для интерфейсов с зависимостями прерывание выполнения может предотвратить сбои программы. Единственная проблема здесь в том, что try catch занимает слишком много строк. Если кажется немного избыточным писать каждый интерфейс.

Пример 2: Прямой захват

Учитывая, что при нормальных обстоятельствах await за командой следует объект Promise, поэтому приведенный выше код может естественным образом найти решение для оптимизации:

function getUserInfo () {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
                 reject('request exception')
         }, 1000)
     })
}

async function logined() {
     let userInfo = await getUserInfo().catch(e => console.warn(e))
     // Execution is not interrupted, userInfo is undefined
     if (!userInfo) return // Need to do non-null check
     let pageInfo = await getPageInfo(userInfo?.userId)
}
logined()