jQuery: Как добавить задержку при повторных попытках AJAX-запроса?

Привет, ребята! У меня возникла проблема с jQuery и AJAX. Я пытаюсь сделать запрос, который автоматически повторяется несколько раз с задержкой, если он не удался. Вот примерно такой код я использую:

function отправитьЗапрос() {
  $.ajax({
    url: 'адрес_сервера',
    попытки: 3,
    текущаяПопытка: 1,
    успех: function(данные) {
      обработатьУспех(данные);
    },
    ошибка: function() {
      if (this.текущаяПопытка++ <= this.попытки) {
        setTimeout(отправитьЗапрос, 1000);
      } else {
        обработатьОшибку();
      }
    }
  });
}

Но при выполнении получаю ошибку TypeError: Illegal invocation. Пробовал использовать промисы - та же история. Может кто-нибудь подсказать, в чем проблема и как ее решить? Заранее спасибо за помощь!

Слушай, а может попробовать использовать рекурсию? Это часто помогает в таких ситуациях. Вот примерный код:

function отправитьЗапрос(попытка = 1) {
$.ajax({
url: ‘адрес_сервера’,
success: обработатьУспех,
error: function() {
if (попытка < 3) {
setTimeout(() => отправитьЗапрос(попытка + 1), 1000);
} else {
обработатьОшибку();
}
}
});
}

Так проще отслеживать попытки и нет проблем с контекстом. Попробуй, может сработает!

Привет, дружище! сталкивался с похожей проблемой. твой код почти верный, но есть небольшая ошибка. вместо this используй $.ajax.settings, так как контекст внутри функции ошибки меняется. вот как можно исправить:

function отправитьЗапрос() {
  $.ajax({
    url: 'адрес_сервера',
    попытки: 3,
    текущаяПопытка: 1,
    success: function(данные) {
      обработатьУспех(данные);
    },
    error: function(xhr, status, error) {
      var settings = $.ajax.settings;
      if (settings.текущаяПопытка++ <= settings.попытки) {
        setTimeout(отправитьЗапрос, 1000);
      } else {
        обработатьОшибку();
      }
    }
  });
}

попробуй так, должно сработать. удачи в кодинге!

Чувак, я бы на твоем месте вообще отказался от jQuery для таких задач. Это древность. Лучше юзай fetch с async/await, там намного проще организовать повторные запросы. Вот примерно так:

async function отправитьЗапрос(попытки = 3, задержка = 1000) {
  for (let i = 0; i < попытки; i++) {
    try {
      const ответ = await fetch('адрес_сервера');
      return await ответ.json();
    } catch (ошибка) {
      if (i === попытки - 1) throw ошибка;
      await new Promise(resolve => setTimeout(resolve, задержка));
    }
  }
}

Код чище и понятнее, плюс работает во всех современных браузерах. Попробуй, не пожалеешь!