Slim.js — это легковесная библиотека для создания компонентов и управления состоянием в приложениях на JavaScript. Одной из важных задач при работе с внешними API является обработка сетевых ошибок и повторные попытки запросов (retry). Slim.js предоставляет гибкие механизмы для интеграции retry-логики напрямую в компоненты.
Retry в контексте сетевых запросов означает автоматическое повторение запроса при возникновении ошибки. Основные параметры, влияющие на поведение retry:
Slim.js использует реактивное состояние, что позволяет интегрировать retry в асинхронные действия компонента. Простейшая структура выглядит так:
import { Slim } from 'slim-js';
class FetchComponent extends Slim {
isLoading = false;
data = null;
error = null;
async fetchData(url, retries = 3, delay = 1000) {
this.isLoading = true;
this.error = null;
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP error: ${response.status}`);
this.data = await response.json();
this.isLoading = false;
return;
} catch (err) {
this.error = err.message;
if (attempt < retries) {
await this.sleep(delay * attempt);
} else {
this.isLoading = false;
throw err;
}
}
}
}
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
customElements.define('fetch-component', FetchComponent);
В этом примере:
fetchData выполняет запрос и
автоматически повторяет его при ошибке.isLoading, data и
error обновляются реактивно, что позволяет
автоматически рендерить компонент.Помимо простого фиксированного количества попыток, Slim.js позволяет создавать более сложные стратегии:
const jitter = Math.random() * 100;
await this.sleep(delay * attempt + jitter);
if (![502, 503, 504].includes(err.status)) break;
if (this.cancelled) break;
Важная часть retry — корректное уведомление о состоянии запроса. Slim.js использует реактивные свойства для этого:
isLoading — индикатор процесса
запроса.error — текст ошибки после неудачных
попыток.data — результат успешного
запроса.Дополнительно можно реализовать событие для внешнего слушателя:
this.dispatchEvent(new CustomEvent('fetch-error', { detail: this.error }));
Retry и обработка ошибок полностью интегрируются с жизненным циклом Slim.js-компонентов:
onBeforeMount — можно инициировать первый запрос.onBeforeUnmount — прерывание активных
retry-запросов.render — реактивно отображает состояния
isLoading, error и data.Такой подход обеспечивает надежность приложения и плавный пользовательский опыт, избегая внезапных сбоев при временных проблемах с сетью.