Back to questions
Middle+
2
Реализуйте функцию asyncAuth с callback-интерфейсом, которая возвращает Promise. Затем реализуйте функцию tryAuth(n), которая использует asyncAuth и в случае ошибки совершает n дополнительных попыток. Если все попытки провалились — возвращает последнюю ошибку.
Companies where asked
Яндекс
Answer from AI
sobes.tech AI
Вот пример реализации функции asyncAuth с callback-интерфейсом, которая возвращает Promise, и функции tryAuth(n), которая повторяет попытки при ошибке:
// asyncAuth принимает callback с (error, result)
function asyncAuth(callback) {
return new Promise((resolve, reject) => {
// Имитация асинхронной авторизации
setTimeout(() => {
const success = Math.random() > 0.5; // 50% шанс успеха
if (success) {
callback(null, "Авторизация успешна");
resolve("Авторизация успешна");
} else {
const err = new Error("Ошибка авторизации");
callback(err);
reject(err);
}
}, 100);
});
}
async function tryAuth(n) {
let lastError = null;
for (let i = 0; i <= n; i++) {
try {
const result = await asyncAuth((err, res) => {
// callback можно использовать для логирования или других целей
if (err) console.log(`Попытка ${i + 1}: ошибка`);
else console.log(`Попытка ${i + 1}: успех`);
});
return result; // Успешная авторизация
} catch (err) {
lastError = err;
}
}
throw lastError; // Все попытки провалились
}
// Пример использования
tryAuth(3)
.then(res => console.log("Результат:", res))
.catch(err => console.error("Ошибка после всех попыток:", err.message));
В этом коде:
asyncAuthимитирует асинхронную операцию с callback и возвращает Promise.tryAuth(n)пытается вызватьasyncAuthдоn+1раз (первая попытка + n повторов).- Если все попытки завершаются ошибкой, выбрасывается последняя ошибка.
- Внутри callback можно обрабатывать промежуточные результаты или ошибки.