Как мне повторить попытку AJAX l oop через n секунд для n раз? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть код в этой структуре.

Если статус ошибки 429, я хочу повторить попытку через 3 секунды, максимум 3 раза.

$.ajax({
    url : 'url',
    type : 'PUT',
    data :  'data',   
    tryCount : 0,
    retryLimit : 3,
    success : function() {
        // do something
    },
    error : function(response, status, error ) {
        if (response.status == 429) {
            this.tryCount++;
            if (this.tryCount <= this.retryLimit) {
                $.ajax(this);
                return;
            } else {
                console.log('update failed!'); 
            }
        } else {
            // handle other errors
        }
    }


});

Куда добавить тайм-аут? Я продолжаю получать бесконечную л oop.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вам просто нужно заменить $.ajax(this) на setTimeout обертку вокруг него:

$.ajax({
  url: 'https://httpstat.us/429?sleep=500',
  data: 'data',
  tryCount: 0,
  retryLimit: 3,
  success: function() {
    // do something
  },
  error: function(response, status, error) {
    if (response.status == 429) {
      this.tryCount++;
      if (this.tryCount <= this.retryLimit) {
        console.log('failure');
        setTimeout(() => {
          console.log('retrying');
          $.ajax(this);
        }, 3000);
        return;
      } else {
        console.log('update failed!');
      }
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
0 голосов
/ 01 мая 2020

вы не задумывались над тем, чтобы поместить свой $. ajax в функцию?

добавление переменной счетчика в сочетании с setTimeout может помочь.

counter = 0 ;
function ajaxfun () {
 $.ajax({
 //....
 error : function(response, status, error ) {
       counter ++;
       if ( counter < 3) { setTimeout(function(){ ajaxfun(); }, 3000); }
    },
 //...
 });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...