попробуйте определить ваш запрос за пределами 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);
}
})