Sobes.tech
Назад к вопросам
Middle+
3

Реализуйте функцию asyncAuth с callback-интерфейсом, которая возвращает Promise. Затем реализуйте функцию tryAuth(n), которая использует asyncAuth и в случае ошибки совершает n дополнительных попыток. Если все попытки провалились — возвращает последнюю ошибку.

Компании, где спрашивали
Яндекс

Ответ от нейросети

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 можно обрабатывать промежуточные результаты или ошибки.