Jquery 如何防止发送重复的ajax请求

Jquery 如何防止发送重复的ajax请求,jquery,ajax,Jquery,Ajax,如果第一次没有成功返回ajax请求,我想忽略第二个请求,直到第一个请求返回成功响应 public static POST<T>(url: string, data): Promise<T> { var p = new Promise((resolve, reject) => { $.ajax({ url: url, data: data, type: "POST",

如果第一次没有成功返回ajax请求,我想忽略第二个请求,直到第一个请求返回成功响应

public static POST<T>(url: string, data): Promise<T> {
    var p = new Promise((resolve, reject) => {
        $.ajax({
            url: url,
            data: data,
            type: "POST",
            cache: false,
            success: function (response: HttpResponse) {
                   //success
            },
            error: function (response) {
                reject("error");
            }
        });
    });

    p.catch((err) => {
        //error
    });

    return p;
}
publicstaticpost(url:string,data):Promise{
var p=新承诺((解决、拒绝)=>{
$.ajax({
url:url,
数据:数据,
类型:“POST”,
cache:false,
成功:函数(响应:HttpResponse){
//成功
},
错误:函数(响应){
拒绝(“错误”);
}
});
});
p、 捕获((错误)=>{
//错误
});
返回p;
}
我已经解决了这个问题。代码如下:

var flag: { Url: string, Data: any }[];
flag = [];
public static POST<T>(url: string, data): Promise<T> {
  for (var i = 0; i < flag.length; i++) {
        if (flag[i].Url == url && CompareObjectEqual(flag[i].Data, data)) {
            return;
        }
    }
    var postInfo = {
        Url: url,
        Data: data
    };
    flag.push(postInfo);
  var p = new Promise((resolve, reject) => {
    $.ajax({
        url: url,
        data: data,
        type: "POST",
        cache: false,
        success: function (response: HttpResponse) {
               flag = [];
               //success
        },
        error: function (response) {
            reject("error");
        }
    });
  });

  p.catch((err) => {
    flag = [];
    //error
  });

  return p;
}
function CompareObjectEqual(a, b) {
  if (!(a instanceof Object && b instanceof Object)) {
    return a === b;
  }

  var aProps = Object.getOwnPropertyNames(a);
  var bProps = Object.getOwnPropertyNames(b);

  if (aProps.length != bProps.length) {
    return false;
  }

  for (var i = 0; i < aProps.length; i++) {
    var propName = aProps[i];
    if ((a[propName] instanceof Object) && (b[propName] instanceof Object)){
        CompareObjectEqual(a[propName], b[propName]);
    } else {
        if (a[propName] !== b[propName]) {
            return false;
        }
    }
  }

  return true;
}
var标志:{Url:string,Data:any}[];
标志=[];
公共静态帖子(url:string,data):承诺{
对于(变量i=0;i{
$.ajax({
url:url,
数据:数据,
类型:“POST”,
cache:false,
成功:函数(响应:HttpResponse){
标志=[];
//成功
},
错误:函数(响应){
拒绝(“错误”);
}
});
});
p、 捕获((错误)=>{
标志=[];
//错误
});
返回p;
}
CompareObjectEqual的函数:

var flag: { Url: string, Data: any }[];
flag = [];
public static POST<T>(url: string, data): Promise<T> {
  for (var i = 0; i < flag.length; i++) {
        if (flag[i].Url == url && CompareObjectEqual(flag[i].Data, data)) {
            return;
        }
    }
    var postInfo = {
        Url: url,
        Data: data
    };
    flag.push(postInfo);
  var p = new Promise((resolve, reject) => {
    $.ajax({
        url: url,
        data: data,
        type: "POST",
        cache: false,
        success: function (response: HttpResponse) {
               flag = [];
               //success
        },
        error: function (response) {
            reject("error");
        }
    });
  });

  p.catch((err) => {
    flag = [];
    //error
  });

  return p;
}
function CompareObjectEqual(a, b) {
  if (!(a instanceof Object && b instanceof Object)) {
    return a === b;
  }

  var aProps = Object.getOwnPropertyNames(a);
  var bProps = Object.getOwnPropertyNames(b);

  if (aProps.length != bProps.length) {
    return false;
  }

  for (var i = 0; i < aProps.length; i++) {
    var propName = aProps[i];
    if ((a[propName] instanceof Object) && (b[propName] instanceof Object)){
        CompareObjectEqual(a[propName], b[propName]);
    } else {
        if (a[propName] !== b[propName]) {
            return false;
        }
    }
  }

  return true;
}
函数比较对象相等(a,b){
if(!(对象的a实例和对象的b实例)){
返回a==b;
}
var aProps=Object.getOwnPropertyNames(a);
var bProps=Object.getOwnPropertyNames(b);
如果(平均速度长度!=平均速度长度){
返回false;
}
对于(变量i=0;i
我不确定您是如何调用承诺的,但您可以始终使用标志或变量来表示已发送请求,然后在返回响应时切换该标志/变量。另外,我假设您使用的是Typescript,所以我使用该语法编写了我的响应

postSubmitted = false;

public static POST<T>(url: string, data): Promise<T> {

    if (postSubmitted) { return };
    postSubmitted = true;

    var p = new Promise((resolve, reject) => {
        $.ajax({
            url: url,
            data: data,
            type: "POST",
            cache: false,
            success: function (response: HttpResponse) {
                postSubmitted = false;
                   //success
            },
            error: function (response) {
                postSubmitted = false;
                reject("error");
            }
        });
    });

    p.catch((err) => {
        //error
    });

    return p;
}
postSubmitted=false;
公共静态帖子(url:string,data):承诺{
如果(提交后){return};
postSubmitted=true;
var p=新承诺((解决、拒绝)=>{
$.ajax({
url:url,
数据:数据,
类型:“POST”,
cache:false,
成功:函数(响应:HttpResponse){
postSubmitted=false;
//成功
},
错误:函数(响应){
postSubmitted=false;
拒绝(“错误”);
}
});
});
p、 捕获((错误)=>{
//错误
});
返回p;
}

以及如何判断这两个请求是否相同。如果相同,为了避免,您似乎希望在第一个方法之后触发第二个方法。在这种情况下,为什么不使用
done()
方法()。你甚至可以通过success方法给Post打电话。