Изменить параметр строки запроса при повторной попытке - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующая структура кода:

$.ajax({
  type:"GET",
  url:"http://example.com",
  data:{
    final:false
  },
  retry: {
    attempt: 1,
    limit: 3,
    delay: 2000
  },
  success((data) => {
    console.log("yay!");
  }),
  error((error) => {
    if (this.retry.attempt++ <= this.retry.limit) {
      var self = this;
      if (self.retry.attempt > self.retry.limit) {
        self.data.final = true;
      }
      setTimeout(() => {$.ajax(self)}, this.retry.delay);
    }
  })
});

Проблема в том, что при первом вызове запроса параметр data стирается, а его значения добавляются в URLкак строка запроса.Так что data больше не существует.Объект, который передается в вызов повтора:

{
  type:"GET",
  url:"http://example.com?final=false",
  retry: {
    attempt: 2,
    limit: 3,
    delay: 2000
  },
  success((data) => {
    //...
  }),
  error((error) => {
    //...
  }
}

Как мне отредактировать параметр final запроса на последнюю попытку?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

попробуйте определить ваш запрос за пределами ajax вызова:

const request = {
  type:"GET",
  url:"http://example.com",
  data:{
    final:false
  }
};

$.ajax({...request, ...{
  retry: {
    attempt: 1,
    limit: 3,
    delay: 2000
  },
  success((data) => {
    console.log("yay!");
  }),
  error((error) => {
    if (this.retry.attempt++ <= this.retry.limit) {
      const retryRequest = {...request, ...this};
      if (this.retry.attempt > this.retry.limit) {
        retryRequest.data.final = true;
      }
      setTimeout(() => {$.ajax(retryRequest)}, this.retry.delay);
    }
  })
});

в качестве альтернативы, если вы имеете дело только с одним флагом, который необходимо установить только в последней попытке:

$.ajax({
  type:"GET",
  url:"http://example.com",
  retry: {
    attempt: 1,
    limit: 3,
    delay: 2000
  },
  success((data) => {
    console.log("yay!");
  }),
  error((error) => {
    if (this.retry.attempt++ <= this.retry.limit) {
      var self = this;
      if (self.retry.attempt > self.retry.limit) {
        self.data = {final: true};
      }
      setTimeout(() => {$.ajax(self)}, this.retry.delay);
    }
  })
});

также, толстые функции стрелок не имеют локального контекста, поэтому вашей функции error не нужно использовать self, то есть это будет работать:

error((error) => {
  if (this.retry.attempt++ <= this.retry.limit) {
    if (this.retry.attempt > this.retry.limit) {
      this.data = {final: true};
    }
    setTimeout(() => {$.ajax(this)}, this.retry.delay);
  }
})
0 голосов
/ 21 декабря 2018

Вы можете попробовать изменить URL-адрес на "http://example.com? Final = false " или "http://example.com? Final = " + false, если false является переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...