0
初めてAjaxリクエストが正常に返されなかった場合、最初のリクエストが成功した応答を返すまで、2番目のリクエストを無視します。繰り返し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;
}
次のように私はalready.Theコードこの問題を解決:
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;
}
CompareObjectEqualの機能:
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;
}
とどのように2つの要求がsame.if同じであれば – foxery
を防ぐために、判断するためにあなたは第二の方法は、最初の後に解雇することにしたいように思え。その場合、なぜ 'done()'や 'methods()'を使わないのですか?[More details](https://stackoverflow.com/questions/5436327/jquery-deferreds-and-promises-then-vs-done )。あなたは成功メソッドからもPostを呼び出すことさえできます。 –