Обёртка разрешает 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. В реальной авторизации повторять неверный пароль бессмысленно: ретраи ограничивают временными сетевыми ошибками и добавляют задержку.