1

ドメイン名のリストをチェックするJavaサーブレットページを作成しており、jqueryajaxリクエストを介して各名前をチェックしています。結果が順不同でDOMに追加されていることを除いて、正常に機能します。要求された順序で要求を処理するだけでなく、長いポーリング効果のように非同期的に処理するための最良の方法は何ですか。私はjavascriptを初めて使用します。

これは私がリクエストに使用しているコードです:

$.ajax({
    async:true,
    type:'GET',
    url:servlet,
    success:function(data){
        $('p').append(data+"<br>");
    }, 
}); 

JSONを介して返されるJavaサーブレットにシーケンス番号を送信することを考えていましたが、もっと簡単な方法があるかどうか疑問に思いました。

4

4 に答える 4

3

私が行うことは、事前に応答のコンテナーを作成し、その周りにコールバックをバインドすることです(bind()関数のように実際にはバインドしません)。

たとえば、のようなコンテナがあると仮定すると<div id="container"></div>、次のように実行できます。

function makeRequest(something) {
    var target = $("<div></div>");
    $("#container").append(target);
    $.get("", {something: something}, function(data) {
        target.html(data);
    });
}

柔軟性という点ではかなり悪い例ですが、要点を説明する必要があります。リクエストが行われる前にコンテナにdivを追加し、そのdivを使用してレスポンスをにプッシュします。つまり、divはリクエストが行われた順序で追加されます。このアイデアを拡張して、スタイリングを使用して、データが入力されるまでdivが存在しないように見せたり、「読み込み中」メッセージを含めることができます。

(また、データの受け渡しはsomethingパラメーターではかなり悪いですが、うまくいけば、あなたはポイントを得ることができます。)

于 2012-04-12T00:59:02.537 に答える
1

あなたの問題は、ブラウザができるだけ多くのAJAXリクエストをサーバーに送信し、サーバーが可能な限りそれらに応答することだと思います。サーバーが他のサーバーよりも高速に応答している可能性が高いため、リクエストは順番に送信されましたが、サーバーの順序が狂っています。

これを修正するには、クエリを順番に送信して、回答が順番に返されるようにします。基本的に、AJAX呼び出しを実行し、その呼び出しが成功すると、2番目のAJAX呼び出しを開始します。

于 2012-04-12T01:03:36.903 に答える
0

サーバーに送信されたリクエストを順番に並べ、結果をキャッシュして、順番にのみ追加することができます

next_to_request = 0;
next_to_append = 0;
results = [];
function reqToServer(){
  var e = next_to_request++;

  $.ajax({
    async:true,
    type:'GET',
    url:servlet,
    success:function(data){
        results[e] = data;
    }, 
  }); 
function loadAnswers(){
   if (results[next_to_request]){
     data = results[next_to_request];
     next_to_request++;
     $('p').append(data+"<br>");
   }
}

setTimeout(100, loadAnswers);

これには、結果を表示するための別のスレッドがあり、正しい順序でのみ表示されます。

于 2012-04-12T01:04:07.060 に答える
0

Ajax関数自体から成功関数を取り出し、成功関数をチェーンすると、それらは順番に起動され、1つのリクエストが終了していない場合は、終了するのを待ってから次のリクエストを起動します。

それを行うための本当に簡単な方法は、次のようにすることです。

var firstOne = $.ajax({
    async:true,
    type:'GET',
    url:servlet
}); 

var SecondOne = $.ajax({
    async:true,
    type:'GET',
    url:servlet
}); 

firstOne.done(function(data){
    $('p').append(data+"<br>");
    SecondOne.done(function(data){
        $('p').append(data+"<br>");
    }); 
}); 

より高度な方法については、 promiseがどのように機能するかを学ぶことをお勧めします。

これは、ajaxリクエストを順番に送信し、最後のリクエストが終了するのを待ってから次のリクエストが開始するよりもはるかに高速です。これにより、ブラウザが使用可能になったときにすべてのリクエストが送信され、done()関数をチェーンするとそうでないリクエストが待機します。終了し、入力した順序で到達したらすぐに終了したものを実行するだけで、コンテンツが正しい順序で追加されます。多くのajax呼び出しを行う場合は、promiseと$ .when / $。thenを使用すると、反復などでより合理的な関数を作成できます。

于 2012-04-12T01:30:43.277 に答える