Создайте Promise вокруг error-first callback. Повторяющая функция выполняет исходный вызов и максимум attempts дополнительных попыток; последняя ошибка остаётся rejection.
Создание функции, возвращающей Promise вместо колбэка
Создайте Promise вокруг error-first callback. Повторяющая функция выполняет исходный вызов и максимум attempts дополнительных попыток; последняя ошибка остаётся rejection.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция asyncAuth(cb) принимает колбэк, в который передаётся возможная ошибка (первый параметр) и данные, полученные от сервера (второй параметр). asyncAuth((err, result) => {}); Ваша задача — реализовать функцию auth(), которая внутри вызывает asyncAuth, но вместо использования колбэка возвращает Promise. @returns {Promise} function auth() { // asyncAuth((err, result) => {}); }
Функция tryAuth() должна использовать auth() и при возникновении ошибки выполнять ещё N дополнительных попыток. Если после всех попыток ошибка остаётся, необходимо отклонить промис с последней полученной ошибкой. @returns {Promise} function tryAuth(attempts) { }
Ответ
Создайте Promise вокруг error-first callback. Повторяющая функция выполняет исходный вызов и максимум attempts дополнительных попыток; последняя ошибка остаётся rejection.
function auth() {
return new Promise((resolve, reject) => {
asyncAuth((error, result) => {
if (error != null) reject(error);
else resolve(result);
});
});
}
async function tryAuth(attempts) {
if (!Number.isInteger(attempts) || attempts < 0) throw new RangeError('Некорректные попытки');
for (let i = 0; ; i++) {
try { return await auth(); }
catch (error) { if (i === attempts) throw error; }
}
}
Контракт считает null/undefined отсутствием ошибки. При attempts=2 возможны три вызова. Немедленный успешный результат прекращает повторы. Для реального сервиса добавляют backoff и повторяют лишь временные ошибки, а не неверные учётные данные.