重试时编辑查询字符串参数

时间:2018-12-21 19:23:07

标签: javascript jquery ajax

我有以下代码结构:

$.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参数?

2 个答案:

答案 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);
  }
})