私は最近、ユーザーが頻繁に ajax リクエストをクリックすると、2 つの問題が発生することに気づきました。
1. 5 つの ajax リクエストを連続してクリックすると、最初の 4 つは実際には無効になり、リソースを節約します。
2. さらに深刻な問題は、送信された最後のリクエストに対する応答が最後のリクエストではない可能性があり、混乱を引き起こす可能性があることです。送信されたリクエストと応答を維持するためにキューも必要です。
実際にキューの実装を設計してみたところ、jQuery が直接 abort メソッドを使用していることがわかり、それほど複雑な実装は必要ありません。結局のところ、完了を待っているものは他にもあります。
jquery を使用して $.get、$.post、$.ajax などの ajax リクエストを送信すると非常に便利ですが、場合によっては ajax リクエストを途中で終了する必要があります。
たとえば、comet をチャットに使用する場合、通常、サーバーはリクエストを送信した後、リンクを更新し、数十秒後にデータを返します。サーバーが 30 秒ごとにリンクを更新すると仮定します。ajax リクエストを 10 秒で停止したい場合はどうすればよいでしょうか。
コードから始めて、後で説明しましょう
var ajaxGet = $.get(“comet_server.php”,{id:1},function(data){ ….//一些操作 }); ajaxGet.abort();
上記のコードは 2 つのナレッジ ポイントで構成されています:
1. $.get が返すデータ型は XMLHttpRequest です。マニュアルを参照してください。 ($.post、$.ajax、$.getJSON、$.getScript も同様です)
2. XMLHttpRequest オブジェクトには abort() メソッドがあります
注: abort() の後、ajax リクエストはすぐに停止しますが、後続の function() は引き続き実行されます。操作の実行を避けたい場合は、function()
の先頭に判定を追加できます。var ajaxGet = $.get(“comet_server.php”,{id:1},function(data){ if(data.length == 0) return true; ….//一些操作 }); ajaxGet.abort();
ajax リクエストを終了します:
var request = $.get(“ajax.aspx”,{id:1},function(data){ //do something }); //终止请求动作. request.abort();
重複したリクエストを防止します:
var request; if(request != null) request.abort(); request = $.get(“ajax.aspx”,{id:1},function(){ //do something }); ajax & setTimeout实现 secondTry 在等待一秒之后将firstTry的ajax终止: var firstTry = $.ajax( //do something ); var secondTry = setTimeout(function(){alert(‘ok');firstTry.abort()},1000);