Обёртка над callback‑функцией, возвращающая Promise

auth переводит error-first callback в Promise. tryAuth(n) повторяет операцию последовательно до первого успеха, делая максимум n + 1 вызовов и отклоняясь последней ошибкой.

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

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

auth переводит error-first callback в Promise. tryAuth(n) повторяет операцию последовательно до первого успеха, делая максимум n + 1 вызовов и отклоняясь последней ошибкой.

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

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

Условие

В проекте есть функция 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) {
}

Ответ

auth переводит error-first callback в Promise. tryAuth(n) повторяет операцию последовательно до первого успеха, делая максимум n + 1 вызовов и отклоняясь последней ошибкой.

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('Некорректный n');
  for (let attempt = 0; attempt <= n; attempt++) {
    try { return await auth(); }
    catch (error) { if (attempt === n) throw error; }
  }
}

Здесь null/undefined в первом аргументе означают отсутствие ошибки. Promise завершается только один раз, даже если callback ошибочно вызван повторно. В реальном приложении повторяют лишь временные сбои и используют паузу; неверный пароль не должен автоматически порождать дополнительные попытки.

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

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

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

Подробнее