@justedoit

Как вызвать функцию определённое кол-во раз?

Здравствуйте, коллеги.
Помогите решить задачу, суть следующая...

Функция getRepeatableData должна вызывать getData и обрабатывать ошибки по условию:

Если вызов getData возвращает ошибку NotFoundError, то мы пробрасываем исключение.
Если вызов getData возвращает ошибку TemporaryError, то мы должны делать повторный вызов getData функции. Кол-во таких вызовов не должно превышать значение maxRequestsNumber. Если кол-во повторного вызова превышает maxRequestsNumber, то функция getRepeatableData должна пробрасывать ошибку AttemtsLimitExceeded.
Если getData выполняется без ошибок - функция должна вернуть то, что вернула getData
Пример:
const getData = (key) => 'hello' + key;
const res = getRepeatableData(getData, '1', 3); // 'hello1'


Повторный вызов функции можно сделать циклом где i будет <= maxRequestNumber. Но таким образом она не сможет превышать, а по заданию она может превышать)
Вот код:

class AttemptsLimitExceeded extends Error {
  constructor() {
    super('Max attempts limit exceed');
    this.name = 'AttemptsLimitExceeded';
  }
}

class NotFoundError extends Error {
  constructor() {
    super('Not found');
    this.name = 'NotFoundError';
  }
}

class TemporaryError extends Error {
  constructor() {
    super('TemporaryError');
    this.name = 'TemporaryError';
  }
}

const getData = (key) => new TemporaryError();

function getRepeatableData(getData, key, maxRequestsNumber = Infinity) {
  try {
   
  } catch (e) {
   
  }

  return getData(key);
}

getRepeatableData(getData, '1', 3);
  • Вопрос задан
  • 884 просмотра
Решения вопроса 1
OxCom
@OxCom
Условия выброса исключений расставьте на свой вкус.
let getData = (attempts) => {
    if (attempts < 1) {
        return Promise.reject('Max attempts reached.');
    }

    return new Promise((res, rej) => {
        console.log('Attempt to fetch data: #' + attempts);
        attempts == 1 
            ? setTimeout(() => {res('This is my data')}, 3000) 
            : setTimeout(() => {rej('Shit happens')}, 3000);
    }).catch(e => {
        return getData(attempts - 1);
    })
}

getData(3)
    .then(r => console.info('=> ' + r))
    .catch(e => console.error(e));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Nc_Soft
let attempts = 0;
do {
attempts++;
try {
//call function here, if success break
}
catch (e) {
}
}
while(attempts < 5)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект