2011-06-25 23 views
27

1回のAJAXリクエストに複数の回答を含める方法はありますか?複数回答AJAXリクエスト

たとえば、サーバにGET要求を出して計算に時間がかかる場合、サーバは時折、進行状況に関するいくつかのデータを返す応答を返すことができますか?

もしそうなら、誰かが、好ましくはJqueryを使って例を投稿して、サーバーがそれを行うことができるメカニズムの説明を付けることができますか?

+0

使用しているサーバサイド言語/フレームワークは何ですか? –

+3

それは不可能なので、それは問題ではありません – genesis

+0

@スクラムマイスターC#/ ASP.NET –

答えて

20

はあなたが定期的に進捗状況をポーリングするために、プロセスを実行するための1と2番目のコールを使用してこの2つのAJAX呼び出しを実装することができますクライアント側では:

var progressID = Math.random(); 

function doCalculation() { 
    $.post('<%=Url.Action("DoCalcluation")%>/' + progressID); 
    setTimeout(pollProgress, 1000); 
} 

function pollProgress() { 
    $.post('<%=Url.Action("GetProgress")%>/' + progressID, function(response){ 
     if(!response.success) { 
      alert('Cannot find progress'); 
      return; 
     } 
      if(response.done) { 
       alert('Done!'); 
      } else { 
      alert('Progress at ' + response.precent + '%'); 
      setTimeout(pollProgress, 1000 /*1 second*/); 
      } 
    }, 'json'); 
} 
+0

賢い、私はそれが好き!セッションを使って進捗データを保存することはありませんでした。 –

+0

@ peter-of-the-cornそれ以外の方法もあります。 [Comet](http://en.wikipedia.org/wiki/Comet_(プログラミング))を見てください。このソリューションを使用する場合は、悪意のあるユーザーがセッション全体を上書きできないように、 'id'パラメータを検証してください。 –

5

速い回答:いいえ、それはできません。

あなたはあなたのようなルックスは、AJAXまたは何も彗星プッシュと呼ばれているが、逆必要があるので、あなたが最も可能性の高いサーバー側のコーディングからの助けを必要以上の応答

+0

しかし、別のリクエストを送信した場合、コードは最初から再起動する必要があります。 : –

+0

再起動?それはどういう意味ですか? – genesis

+1

再起動すると、やり直すことができます。 –

1

を得るために多くの要求を送信する必要があります。私はあなたがサーバ側でどの言語を使用しているのかわかりませんが、基本的な考え方は、ブラウザが無限ループ(サーバ側)を使用し、接続が生きている間にデータをプッシュできる限り、HTTPレスポンスを遅らせることです。

これをチェック:

public class ProgressInfo 
{ 
    public int Percent {get;set;} 
    public bool Done {get;set;} 
} 

public JsonResult DoCalculation(string id) 
{ 
    ProgressInfo progress = new ProgressInfo(); 
    if(!string.IsNullOrEmpty(id)) 
    { 
     Session[id] = progress; 
    } 

    //periodicly update progress 
    progress.Percent++; 
} 

public JsonResult GetProgress(string id) 
{ 
    ProgressInfo progress; 
    if(string.IsNullOrEmpty(id) 
     || (progress = Session[id] as ProgressInfo) == null) 
    { 
     return Json(new { 
      success = false 
     }); 
    } 
    if(progress.done) 
    { 
     Session.Remove(id); 
    } 
    return Json(new { 
     success = true, 
     done = progress.done, 
     percent = progress.Percent 
    }); 
} 
:サーバー側で

http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ

+0

スクリプトの前にバッファデータを出力する終了?いいアイデアですが、非常に複雑で必要な細かいapache/php設定 – genesis

+0

はい、これは独自のハンドラを作成すると複雑になる可能性がありますが、大規模な場合はサーバープッシュを処理するWebSyncのような製品があります。 – vlscanner

1

は、それが戻って複数の応答を送信することができますxajaxのを見て、もう一つは、これまで特定の領域にリダイレクトすることができます。これに関して、xajaxはjQueryよりはるかに優れています。私は1つのリクエストを行うことができ、サーバーはHTML、JavaScript、コールなどの複数の応答を含むレスポンスを作成することができます。 jQueryはこれを行う必要があります。そして、私は一度だけjQueryに切り替えることができます...これは、私が切り替えられないようにする唯一のことです。

+0

XAJAXはPHP用であり、XMLでデータを転送するだけです。 –

0

1つのAjaxリクエスト-----------> 1つの応答を取得します。

あなたが実際にできることは何ですか。

応答データを確認してください と は、取り出されるデータごとに異なる動作を行います。

関連する問題