Главная » Хабрахабр » [Перевод] JavaScript. Работаем с исключениями и данными в конструкциях async/await без блоков try-catch

[Перевод] JavaScript. Работаем с исключениями и данными в конструкциях async/await без блоков try-catch

Появившиеся в JavaScript новые асинхроные конструкции async/await выглядят проще, чем Promise, и, конечно, значительно читабельнее, чем «callback-джунгли». Но одна вещь беспокоила меня — это использование try-catch. Сначала я подумал, что это не проблема, но, к несчастью, мне пришлось работать с цепочкой вызовов API, в которой каждый вызов API имел свое сообщение об ошибке, которое должно было прологировано. Вскоре я понял, что создаю «try/catch-джунгли», которые ничем не лучше «callback-джунглей».
Давайте рассмотрим этот Promise, который возвращает данные или исключение через 2 секунды в зависимости от параметра rejectPromise:

// api.js
const fetchData = async (duration, rejectPromise) => ( new Promise((resolve, reject) => ) } resolve({ version: 1, hello: 'world', }); }, duration); })
); module.exports = { fetchData,
};

Типичное использование этой функции будет выглядеть так:

const { fetchData } = require('./api'); const callApi = async () => { try { const value = await fetchData(2000, false); console.info(value); } catch (error) { console.error(error); }
} callApi(); /* OUTPUT: { version: 1, hello: 'world' } (rejectPromise=false) { error: 'Error Encountered', status: 'error' } (rejectPromise=true) */

Как вы можете видеть, когда параметр rejectPromise является ложным, Promise возвращает значение {version: 1, hello: 'world'}, а когда оно истинно, он вызывает исключение { error: 'Error Encountered', status: 'error' }.

Теперь мы попытаемся использовать Promise, чтобы сделать этот код более простым. Это типичная реализация async-await. Давайте напишем функцию-обертку, которая упростит нам обработку исключений.

// wrapper.js
const wrapper = promise => ( promise .then(data => ({ data, error: null })) .catch(error => ({ error, data: null }))
); module.exports = wrapper;

Итак, давайте изменим исходный код с применением функции-обертки: Мы можем видеть, что функция-обертка принимает Promise в качестве входного параметра и возвращает ошибку или даные с использовнаием конструкции then().catch().

const { fetchData } = require('./api');
const wrapper = require('./wrapper'); const callApi = async () => { const { error, data } = await wrapper(fetchData(2000, false)); if (!error) { console.info(data); return; } console.error(error);
} callApi(); /* OUTPUT: { version: 1, hello: 'world' } (rejectPromise=false) { error: 'Error Encountered', status: 'error' } (rejectPromise=true) */

image — получаем тот же результат но более читабельным кодом.

Полезные ссылки.

Почему [не] надо использовать async/await 1.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Любая интернет-компания обязана тайно изменить программный код по требованию властей

6 декабря 2018 года парламент Австралии принял Assistance and Access Bill 2018 — поправки к Telecommunications Act 1997 о правилах оказания услуг электросвязи. Говоря юридическим языком, эти поправки «устанавливают нормы для добровольной и обязательной помощи телекоммуникационных компаний правоохранительным органам и ...

Трехмерный движок на формулах Excel для чайников

В этой статье я расскажу, как мне удалось портировать алгоритм рендера трехмерных сцен на формулы Excel (без макросов). В принципе, для понимания формул должно быть достаточно знания школьного курса математики (+умение умножать трехмерную матрицу на вектор). Для тех, кто не ...