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