2017-06-27 16 views
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; 
} 
+0

とどのように2つの要求がsame.if同じであれば – foxery

+0

を防ぐために、判断するためにあなたは第二の方法は、最初の後に解雇することにしたいように思え。その場合、なぜ 'done()'や 'methods()'を使わないのですか?[More details](https://stackoverflow.com/questions/5436327/jquery-deferreds-and-promises-then-vs-done )。あなたは成功メソッドからもPostを呼び出すことさえできます。 –

答えて

0

を私はあなたを呼び出しているか定かではありませんよ約束を守ることはできますが、フラグや変数を使用してリクエストが送信されたことを知らせてから、応答が返されたときのフラグ/変数。また、私は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; 
} 
+0

ありがとう、私はあなたに触発されています。 – foxery

関連する問題