При разработке 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 или проверка данных, в едином и чистом формате.

Благодаря использованию ?=, код становится более чистым и предсказуемым, особенно при работе с промисами и асинхронными операциями.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Pavel Pogosov: ?= Operator in JavaScript

Предыдущая статьяРеализация ролевого контроля доступа в Elasticsearch
Следующая статьяКак проходится ассоциативный массив на C++