JavaScript:为 jquery ajax 重试添加延迟

JavaScript: Add delay to a jquery ajax retry

我有以下结构的代码。目的是发送一个 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();
    }
  }
});

问题是我在尝试调用 $.ajax 时收到 TypeError: Illegal invocation。我还尝试用 promises 替换,如下所示:

new Promise(function(resolve) {
  setTimeout(resolve, 1000);
}).then(function() {
  $.ajax(this);
});

但是我得到了同样的错误。这是怎么回事,我该如何解决?

注意:我正在使用 Atlassian SDK 构建 Jira 插件,所以我的 javascript 版本似乎受到限制。我不是 100% 确定 我有哪个 版本,但我知道当我尝试使用箭头函数时它无法编译。

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

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

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