2012-04-12 8 views
1

jquery ajaxリクエストによってドメイン名のリストをチェックし、各名前をチェックするJavaサーブレットページを作成しています。結果が順不同でDOMに追加されていることを除いて、正常に動作します。要求された順序で要求を処理する最善の方法は何ですか?また、長いポーリング効果のように非同期的に行う方法があります。私はjavascriptで新しいです。リクエストされた順番でjquery ajaxリクエストを処理する方法

これは私が要求を使用していますコードです:

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

私はJSONを通してそれを返すJavaサーブレットにシーケンス番号を送信することを考えていましたが、簡単な方法があった場合、私は思っていました。

+3

'成功'の後に浮遊してしまいました。将来のバグからあなたを救うだけです。 – Joseph

+1

まず、AJAXリクエストを作成する直前に各応答のコンテナを作成してから、コールバックにそのコンテナを使用させるだけです。 – Corbin

答えて

3

私がやることは、応答のためのコンテナを事前に作成してから、実際にbind()関数のようにバインドしないでコールバックをバインドすることです。

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

それは、柔軟性の点では、むしろ悪い例ですが、それはポイントを説明する必要があります:あなたは<div id="container"></div>状の容器に何かを持っていると仮定すると例えば

は、次の操作を行うことができます。要求が行われる前にコンテナにdivを追加し、そのdivを使用して応答をプッシュします。つまり、リクエストが行われた順にdivが追加されます。このアイデアを拡張して、スタイル設定を使用して、divが入力されるまで表示されないようにするか、「読み込み中」というメッセージが表示されるようにすることができます。

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

+0

私はこの感謝の仕事を得ました!私はカウンターを実行していると私はdivにattrの名前を追加するために、そのカウンターを使用し、私はそのカウンターとのdivのDOMクエリを成功した。 :) – Rehat

1

私はあなたの問題を推測しているブラウザがサーバにできるだけ多くのAJAXリクエストを送信していることです、サーバーは可能な限り応答します。サーバーは他のサーバーよりも速く応答しているため、要求が順番に送信されたにもかかわらず、それらを順番に取得する可能性があります。

この問題を解決するには、回答を順番に送信するためにクエリを順次送信することです。基本的にAJAXコールを実行し、そのコールが成功すると、2番目のAJAXコールなどを開始します。

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); 

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

+0

お気に入りのソリューションでキャッシュに配列が、なぜあなたはsetTimeOutが必要ですか? – Bergi

0

成功関数をAjax関数から取り出して、成功関数を連鎖させます。順番に実行されます.1つの要求が終了していない場合は、次の関数を終了するまで終了します。 promises仕事は良いアイデアです方法を学ぶより高度な方法については

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>"); 
    }); 
}); 

:それを行うの

本当に簡単な方法は、ちょうどそのように行うことであろう!

これは、Ajaxリクエストを連続して送信するよりはるかに高速です。次のリクエストが開始される前に最後のリクエストが完了するのを待っています。これにより、ブラウザが使用可能なときにすべてを送信し、done完了していないものがあれば、すぐに終了した順番に実行してください。完了したら、順番どおりにコンテンツが追加されます。多くのAjax呼び出しを行うと、約束事と$ .when/$を使って、反復などを使ってより合理的な関数を構築できます。

関連する問題