Этот вопрос проверяет умение реализовать повторные попытки выполнения операций, что критично для обработки временных сбоев в сетевых запросах или взаимодействии с внешними сервисами.
Механизм повторных попыток (retry) используется, когда операция может временно завершиться неудачей из-за нестабильности сети, перегрузки сервера или других временных проблем. Вместо того чтобы сразу сообщать об ошибке пользователю, система делает несколько попыток выполнить действие, что повышает надежность приложения.
Для создания retry-логики без библиотек нужно определить несколько ключевых параметров:
Ниже приведена функция retry для асинхронных операций, возвращающих Promise. Она использует экспоненциальную задержку и проверку типа ошибки.
async function retry(operation, maxAttempts = 3, delayMs = 1000) {
let lastError;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
// Пытаемся выполнить операцию
return await operation();
} catch (error) {
lastError = error;
// Проверяем, стоит ли повторять (например, только сетевые ошибки)
if (!isRetryableError(error) || attempt === maxAttempts) {
throw new Error(`Failed after ${attempt} attempts: ${error.message}`);
}
// Экспоненциальная задержка: delayMs * 2^(attempt-1)
const waitTime = delayMs * Math.pow(2, attempt - 1);
console.log(`Attempt ${attempt} failed. Retrying in ${waitTime}ms...`);
await sleep(waitTime);
}
}
}
// Вспомогательная функция для паузы
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// Пример проверки ошибки на возможность повтора
function isRetryableError(error) {
// Сетевые ошибки или 5xx статусы обычно повторяемы
return error.code === 'ECONNRESET' ||
error.code === 'ETIMEDOUT' ||
(error.response && error.response.status >= 500);
}
// Использование
async function fetchData() {
const response = await fetch('https://api.example.com/data');
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
}
// Вызов с retry
retry(fetchData, 4, 1000)
.then(data => console.log('Data:', data))
.catch(err => console.error('Final error:', err));Retry-логика полезна при вызовах внешних API, запросах к базам данных или любых операциях ввода-вывода, где возможны временные сбои. Однако важно не применять её слепо:
Вывод: Реализация retry без библиотек позволяет гибко контролировать стратегию повторных попыток и лучше понять механизм обработки ошибок. Используйте её для повышения устойчивости приложений, работающих с ненадежными внешними сервисами, но всегда учитывайте идемпотентность и характер ошибок.
Уровень
Рейтинг:
3
Сложность:
4
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Java Developer в телеграм