我有以下结构的代码。目的是发送Ajax请求,然后重试几次,每次尝试之间都存在延迟:
$.ajax({
type: 'GET',
url: 'https://example.com',
retryLimit: 3,
attempt: 1,
success: function (data) {
doStuff();
},
error: function (data) {
if (this.attempt++ <= this.retryLimit) {
var retry = function () {
$.ajax(this);
};
setTimeout(retry, 1000);
} else {
handleError();
}
}
});
问题是尝试调用TypeError: Illegal invocation
时得到$.ajax
。我也试图用诺言代替,像这样:
new Promise(function(resolve) {
setTimeout(resolve, 1000);
}).then(function() {
$.ajax(this);
});
但是我遇到了同样的错误。发生了什么,我该如何解决?
注意:我正在使用Atlassian SDK来构建Jira插件,因此我的JavaScript版本似乎受到限制。我不确定自己拥有哪个版本,但不是100%知道,但是我知道当我尝试使用箭头函数时,它无法编译。
答案 0 :(得分:2)
在执行this
函数时,retry()
的上下文已更改,并且不再是AJAX信息。但是,您应该可以使用变量将其包装在闭包中:
var self = this;
var retry = function () {
$.ajax(self);
};
(请注意,整个上下文本身也发生在回调error
中。因此,如果this
仍然不是您想要的样子,则可能需要将相同的概念应用于另一个范围更高。)