JavaScript:将延迟添加到jQuery Ajax重试

时间:2018-12-14 16:12:24

标签: javascript jquery ajax delay atlassian-plugin-sdk

我有以下结构的代码。目的是发送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%知道,但是我知道当我尝试使用箭头函数时,它无法编译。

1 个答案:

答案 0 :(得分:2)

在执行this函数时,retry()的上下文已更改,并且不再是AJAX信息。但是,您应该可以使用变量将其包装在闭包中:

var self = this;
var retry = function () {
    $.ajax(self);
};

(请注意,整个上下文本身也发生在回调error中。因此,如果this仍然不是您想要的样子,则可能需要将相同的概念应用于另一个范围更高。)