auth переводит error-first callback в Promise. tryAuth(n) повторяет операцию последовательно до первого успеха, делая максимум n + 1 вызовов и отклоняясь последней ошибкой.
Обёртка над callback‑функцией, возвращающая Promise
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 ошибочно вызван повторно. В реальном приложении повторяют лишь временные сбои и используют паузу; неверный пароль не должен автоматически порождать дополнительные попытки.