За последнее время, благодаря поддержке сообщества, JavaScript стал в технологической индустрии языком, девиз которого “Напиши одни раз — выполняй где угодно”. С его помощью вы можете разрабатывать почти все, что пожелаете: мобильные, настольные и веб-приложения. На JavaScript также создаются нейронные сети и программируются дроны. Что и говорить — этот язык способен на многое. А у профессионального разработчика JavaScript всегда найдется в запасе несколько особо крутых приемов, накопленных за многие годы работы.
Далее я поделюсь тремя своими любимыми и очень эффективными приемами JavaScript, которые сэкономят время разработки.
1. Создание асинхронного контекста
Обработка асинхронных событий в JavaScript — довольно сложный аспект программирования, особенно для новичков, поскольку он непосредственно связан с промисами. Проще говоря, сам разработчик управляет выполнением кода. До выхода ES6 (2015) приходилось использовать множество методов then
и catch
, объединенных в цепочки, и асинхронный код обрабатывался следующим образом:
promise
.then(function () { ... })
.catch(function () { ... })
.then(function () { ... })
.catch(function () { ... })
В ES6 было представлено новое и эффективное ключевое слово await
. Оно позволяет просто подождать завершения любой асинхронной задачи, после чего продолжить выполнение. Все бы хорошо, но есть одно большое “но”: место await
в функции async
, и его нельзя задействовать в глобальной области видимости. Поэтому мы воспользуемся IIFE для имитации асинхронного контекста глобального уровня, что позволит применять await
везде, где необходимо:
let data
(async () => {
// Это асинхронный контекст для await
const res = await fetch("https ://google.com/mcdkncjs")
data = await res.json()
})();
console.log(data)
Благодаря IIFE вы можете создавать асинхронный контекст для обработки различных асинхронных задач.
2. Именованные параметры функции
Как правило, при определении функции у вас есть параметры, которые поочередно передаются при вызове и разделяются запятой (,). Это прекрасно работает при наличии небольшого их числа, отличной IDE или текстового редактора с технологией IntelliSense. В противном случае усложняется процесс написания функции и приходится запоминать все параметры по порядку, что довольно утомительно.
createUser(name, surname, 1542, 21, true)
Однако с помощью ES6 можно создавать функции с именованными параметрами, облегчая процесс их чтения и написания. Вместо последовательной передачи параметров передается один объект аргументов, содержащий их все, что избавляет от необходимости запоминать порядок. Кроме того, в функции можно провести деструктуризацию объекта и получить параметры по отдельности.
// Объявляем функцию, используя деструктурированные параметры.
function createUser({
name,
surname,
id,
age,
isForeigner
}) { ... }
// После этого передаем объект параметров
createUser({
name,
surname,
id: 1542,
age: 21,
isForeigner: true
})
С деструктурированными параметрами вызов функций становится более явным и простым.
3. Функциональная обертка для блоков Try/Catch
С ростом популярности async/await
сократились случаи применения catch
, вследствие чего разработчики стали задействовать блоки try/catch
для обработки ошибок в асинхронных функциях. Однако новый блок означает новый уровень индентации (стиль отступов) и новый уровень сложности.
try {
var quote = await getQuote();
console.log(quote);
catch (error) {
console.error(error);
}
Блок try/catch
для обработки ошибок в асинхронных функциях полностью нивелирует преимущество индентации await
перед then
.
Поэтому было бы лучше, имей мы функцию, которая возвращала бы ошибку или результат в случае успеха без индентации. Именно этой реализацией мы сейчас и займемся. Для этого оборачиваем блок try/catch
функцией, а затем используем ее для перехвата ошибок без индентации.
Функция обработки ошибок будет асинхронной, поскольку внутри мы намерены задействовать await
и принять в качестве аргумента другую асинхронную функцию. Далее в зависимости от успешного ее выполнения вернется результат или ошибка.
const handled = async (asyncFunc) => {
try {
const res = await asyncFunc();
return [null, res];
} catch (error) {
return [error, null]
}
}
Обертывание try/catch
внутри функции позволяет работать с ней ее без индентации.
С помощью функции handled
можно обрабатывать ошибки на том же уровне индентации, что и await
. Нужно лишь обернуть асинхронную функцию посредством handled
и провести деструктуризацию и ответа, и ошибки.
const [error, res] = await handled(asyncFunc)
handled
возвращает и ошибку, и ответ, но в зависимости от успеха один из них — null
.
Отлично! Теперь вы знаете 3 замечательных приема JavaScript, которые являются неотъемлемой частью моей ежедневной работы. Рекомендую вам также взять их на заметку. Благодарю за внимание!
Читайте также:
- 11 уникальных однострочников JavaScript, достойных восхищения
- Движок JavaScript: что внутри
- Двоичное дерево поиска: вставка значения с использованием JavaScript
Читайте нас в Telegram, VK и Дзен
Перевод статьи Can Durmus: 3 Marvelous JavaScript Tips to Speed Up the Development Process