我有以下代码结构:
$.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
参数?
答案 0 :(得分:0)
如果false为变量,您可以尝试将URL更改为“ http://example.com?final=false”或“ http://example.com?final=” + false
答案 1 :(得分:0)
尝试在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);
}
})