При разработке JavaScript, особенно при выполнении асинхронных задач и обработке ошибок, часто полагаются на блоки try-catch и async-await. Они эффективны, но могут привести к раздутому и трудночитаемому коду.
Для решения этой проблемы был предложен новый оператор ?=
. Он упрощает обработку ошибок и улучшает читаемость кода.
В статье — о том, как он работает и какие преимущества дает разработчикам.
Упрощение обработки ошибок
Одно из самых больших преимуществ ?=
заключается в том, что он упрощает контроль ошибок. Вместо того чтобы оборачивать каждую потенциально «опасную» строку в блок try-catch, можно использовать этот безопасный оператор присваивания.
Он возвращает результат в формате [error, result]
. Если ошибка не возникла, возвращается [null, result]
; в противном случае — [error, null]
.
Вот пример:
const [error, data] ?= await fetchData();
if (error) {
console.log("An error occurred:", error);
} else {
console.log("Data:", data);
}
Беспроблемная работа с async-функциями и промисами
Этот оператор отлично взаимодействует с промисами и async-функциями, что делает его идеальным для обработки ошибок в асинхронных задачах. Он будет полезен при выполнении запросов к API, чтении файлов или любой другой операции, в которой что-то может пойти не так.
Например:
async function getData() {
const [fetchError, response] ?= await fetch(
"https://api.example.com/data"
);
if (fetchError) {
handleFetchError(fetchError);
return;
}
const [jsonError, data] ?= await response.json();
if (jsonError) {
handleJsonError(jsonError);
return;
}
return data;
}
Более чистый и читабельный код
Использование ?=
помогает уменьшить вложенность кода и избавиться от лишних блоков try-catch.
Кроме того, он делает обработку ошибок более явной и интуитивно понятной, что приводит к оптимизации сопровождаемости и уменьшению количества пропущенных критических ошибок.
Сравним старый и новый подходы.
Традиционный подход:
try {
const response = await fetch("https://api.example.com/data");
const json = await response.json();
const data = parseData(json);
} catch (error) {
handleError(error);
}
С оператором ?=
:
const [fetchError, response] ?= await fetch("https://api.example.com/data");
if (fetchError) {
handleFetchError(fetchError);
return;
}
Код стал чище.
Унифицированный подход
Оператор ?=
работает с любым объектом, реализующим метод Symbol.result
.
Это позволяет использовать один и тот же подход к обработке ошибок и результатов, независимо от типа данных или API. Такой подход способствует гибкости при работе со сложными структурами данных или взаимодействии с различными сервисами.
Вот пример:
const obj = {
[Symbol.result]() {
return [new Error("An error occurred"), null];
},
};
const [error, result] ?= obj;
if (error) {
console.log("Error:", error);
}
Что такое Symbol.result?
Symbol.result
— метод, который определяется для объектов или функций, чтобы контролировать, как они возвращают свои результаты при использовании оператора безопасного присваивания.
Когда объект или функция вызывается через ?=
, Symbol.result
преобразует возвращаемое значение в кортеж [error, result]
.
Представьте, что у вас есть объект, который реализует Symbol.result
для обработки собственных ошибок:
const obj = {
[Symbol.result]() {
return [new Error("Error in object"), null];
}
};
const [error, result] ?= obj;
console.log(error); // Вывод: Error in object ("Ошибка в объекте")
Symbol.result
позволяет разработчикам настраивать поведение объектов и функций при использовании оператора ?=
.
Это особенно полезно для библиотек или фреймворков, где требуется унифицированный подход к обработке ошибок.
Например, объект ответа API может реализовать Symbol.result
, чтобы возвращать ошибки или успешные данные в стандартном формате.
Почему стоит использовать этот оператор?
Оператор ?=
упрощает обработку ошибок и улучшает читаемость кода. Он уменьшает необходимость в повторяющихся блоках try-catch
, обрабатывая ошибки на разных этапах, таких как сетевые запросы, парсинг JSON или проверка данных, в едином и чистом формате.
Благодаря использованию ?=
, код становится более чистым и предсказуемым, особенно при работе с промисами и асинхронными операциями.
Читайте также:
- Типы данных JavaScript: передача по значению и ссылке
- 5 концепций JavaScript, которые должен знать каждый разработчик
- TypeScript: расширение возможностей JavaScript
Читайте нас в Telegram, VK и Дзен
Перевод статьи Pavel Pogosov: ?= Operator in JavaScript