Примеры решений в JavaScript
Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.
Текущая статья посвящена javaScript: массивы, async/await, fetch, валидация, DOM и шаблоны надёжного клиентского кода..
Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:
- Основы
- Система и сеть
- Данные и разметка
- Код и разработка
- Языки
- Искусственный интеллект
- Проект
- Инфраструктура и безопасность
- Спин-офф
Обязательно пройдитесь.
А теперь приступим к нашему предмету.
Термины
| Термин | Смысл |
|---|---|
Promise |
Объект будущего результата асинхронной операции |
async/await |
Синтаксис над Promise |
AbortController |
Отмена fetch и таймауты |
| Immutability | Новые объекты вместо мутации (где уместно) |
1. Группировка и дедупликация
const users = [
{ id: 1, city: 'Moscow' },
{ id: 2, city: 'Kazan' },
{ id: 3, city: 'Moscow' }
];
const byCity = users.reduce((acc, u) => {
(acc[u.city] ??= []).push(u);
return acc;
}, {});
const uniqueCities = [..new Set(users.map((u) => u.city))];
Шаги: определите ключ группировки → reduce или Map → проверьте пустые ключи.
2. Fetch с таймаутом и ошибками HTTP
3. Retry с экспоненциальной задержкой
async function retry(fn, { attempts = 3, baseMs = 300 } = {}) {
let lastError;
for (let i = 0; i < attempts; i++) {
try {
return await fn();
} catch (e) {
lastError = e;
if (i === attempts - 1) break;
await new Promise((r) => setTimeout(r, baseMs * 2 ** i));
}
}
throw lastError;
}
Повторяйте только временные ошибки (сеть, 502, 503), не 400/401.
4. Глубокое клонирование (простые данные)
const clone = structuredClone(original);
Для объектов с функциями или циклическими ссылками нужны специализированные библиотеки.
5. Валидация формы (клиент)
function validateEmail(value) {
if (!value.includes('@')) return 'Некорректный email';
return null;
}
function validateForm(values, validators) {
const errors = {};
for (const [name, validate] of Object.entries(validators)) {
const msg = validate(values[name]);
if (msg) errors[name] = msg;
}
return errors;
}
Серверная валидация обязательна: клиент — только UX.
6. Debounce для поиска
function debounce(fn, ms) {
let t;
return (..args) => {
clearTimeout(t);
t = setTimeout(() => fn(..args), ms);
};
}
const onSearch = debounce((q) => fetchResults(q), 300);
Типичные ошибки
- Забытый
clearTimeout/ отписка от событий → утечки. awaitбезtry/catchв UI → немые падения.- Мутация state в React напрямую.
Чек-лист
- HTTP-ошибки и таймауты обработаны.
- Нет утечек таймеров и подписок.
- Критичная логика покрыта тестами (Vitest/Jest).