Как сделать возврат последнего успешного значения и retry вместе с delay в случае ошибки?

В Node.js, возврат последнего успешного значения вместе с retry и задержкой в случае ошибки можно реализовать с помощью конструкции "async/await" и цикла "for" или "while", в котором будет происходить повторная попытка выполнения операции.

Для начала, вам понадобится функция, которая будет выполнять операцию и возвращать результат. Для примера, давайте предположим, что вы хотите сделать HTTP-запрос к какому-то удаленному серверу:

const axios = require('axios');

async function makeRequest(url) {
  try {
    const response = await axios.get(url);
    return response.data; // возвращаем успешный результат
  } catch (error) {
    throw error; // выбрасываем ошибку, чтобы повторить попытку
  }
}

Затем, для реализации retry с задержкой, вы можете использовать цикл "for" или "while", который будет повторять операцию до тех пор, пока она не выполнится успешно:

async function retryWithDelay(fn, delay, maxRetries) {
  let lastValue = null;
  
  for (let i = 0; i < maxRetries; i++) {
    try {
      lastValue = await fn(); // вызываем переданную функцию
      return lastValue; // возвращаем успешный результат
    } catch (error) {
      console.log(`Error: ${error.message}`);
      await new Promise(resolve => setTimeout(resolve, delay)); // задержка перед повторной попыткой
    }
  }
  
  throw new Error('Max retries exceeded'); // выбрасываем ошибку, если достигнуто максимальное количество попыток
}

Теперь вы можете использовать функцию retryWithDelay для выполнения операции с retry и возвратом последнего успешного значения:

const url = 'https://example.com';
const delay = 1000; // 1 секунда
const maxRetries = 3;

retryWithDelay(() => makeRequest(url), delay, maxRetries)
  .then(result => console.log(`Success: ${result}`))
  .catch(error => console.log(`Error: ${error.message}`));

В этом примере мы вызываем makeRequest() внутри функции retryWithDelay и передаем ее как аргумент. Функция retryWithDelay выполняет попытки выполнения makeRequest() с задержкой и возвращает последний успешный результат. Если после всех попыток операция не выполнится успешно, будет выброшена ошибка.

Это лишь один из вариантов реализации, и вы можете настроить его под свои конкретные требования и потребности вашего проекта.