Промис‑обёртка для функции аутентификации

Обёртка разрешает Promise данными или отклоняет ошибкой callback. tryAuth(n) делает одну исходную попытку и ещё n повторов, возвращая успех либо отклоняясь последней ошибкой.

Короткий ответ

Что ответить на собеседовании

Обёртка разрешает Promise данными или отклоняет ошибкой callback. tryAuth(n) делает одну исходную попытку и ещё n повторов, возвращая успех либо отклоняясь последней ошибкой.

Подробный разбор

Ответ с пояснениями

Условие

В проекте присутствует асинхронная функция asyncAuth, которая получает колбэк. В этом колбэке могут быть переданы ошибка (первый параметр) и данные, полученные от сервера (второй параметр). Требуется реализовать функцию‑обёртку auth, которая будет вызывать asyncAuth, но вместо колбэка возвращать объект Promise.

 import asyncAuth from '~';

/**
  функция `asyncAuth(callback)` принимает callback, в который может
  быть передана ошибка (перемк аргументом) и данные
  с буксида (вторая аргументом).
  asyncAuth(error, data) => {});
  *
  Вам нужно реализовать функцию `auth()`,
  которая вызывает `asyncAuth()`, но возвращает Promise.
  *
  @returns (Promise)
  */
function auth() {
    asyncAuth((error, data) => {});
}

/**
  функция `tryAuth()` использует `auth()` и, в случае ошибки,
  совершает N дополнительные попытки.
  в случае, если все попытки провалились - вернуть последнюю ошибку
  *
  @returns (Promise)
  */
function tryAuth(n) {
}

Задача подразумевает создание промиса‑обёртки и добавление логики повторных попыток при неудаче, при этом в случае полного провала необходимо вернуть последнюю полученную ошибку.

Ответ

Обёртка разрешает Promise данными или отклоняет ошибкой callback. tryAuth(n) делает одну исходную попытку и ещё n повторов, возвращая успех либо отклоняясь последней ошибкой.

function auth() {
  return new Promise((resolve, reject) => {
    asyncAuth((error, data) => error != null ? reject(error) : resolve(data));
  });
}
async function tryAuth(n) {
  if (!Number.isInteger(n) || n < 0) throw new RangeError('Некорректное число повторов');
  for (let attempt = 0; ; attempt++) {
    try { return await auth(); }
    catch (error) { if (attempt === n) throw error; }
  }
}

Предполагается error-first контракт, где null/undefined означают отсутствие ошибки. При n=0 выполняется ровно один вызов. Синхронное исключение asyncAuth также превращается в rejection конструктора Promise. В реальной авторизации повторять неверный пароль бессмысленно: ретраи ограничивают временными сетевыми ошибками и добавляют задержку.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее