2011-12-22 22 views
0

私はJavaScriptで非同期呼び出しを行うと、コールバック関数をいくつかのキューに入れるのでしょうか?Javascriptでメッセージの優先順位付けはありますか?

何らかの機能が配置されているキューの位置を制御できますか?明示的に、または何らかの優先事項によって?

UPDATE 1

私の質問はAJAXだけではありません。非同期呼び出しは、(私が間違っている可能性があります)JSで使用されるいくつかの場所があります。

  1. イベントハンドラ
  2. のXMLHttpRequestが
  3. のsetTimeout()を呼び出しますが、/のsetInterval()

回答によると、私は一般的な答えはいいえ、すなわちメッセージキューはjavascriptからアクセスできないと考えています。

+1

キューへの非同期要求の機能 – Gumbo

+0

@ガンボ:なぜあなたは質問を繰り返すのですか? –

+0

@ TomalakGeret'kal私は、Dimsは要求コールバックのキューがすでに存在していると仮定し、要素の優先順位付け方法を知らないという方法で質問を解釈します。 – Gumbo

答えて

3

いいえ。ブラウザは、非同期要求の実際のキューを維持しません。すべてのブラウザーが必ずしも同じ方法で処理するとは限りませんが、概念的には、ブラウザーは、その要求に対する応答が返るか、タイマーが切れるまで、要求を処理しているスレッドを単に中断します。その時点で、レスポンスによって提供されたデータでコールバック内のスレッドの実行を再開します。私はそれを単純化したと確信していますが、詳細については、私たちが話しているブラウザによって答えが異なるでしょう。

AJAXリクエストを注文したい場合は、そのためのメカニズムを構築するか、既存のJavaScriptプラグイン/ライブラリを見つける必要があります。最も簡単な方法は、おそらく、優先順位を必要とする要求のコールバックで後続の要求を行うことです。あなたが彼らの前に行くべきものより後に起こることをあなたは知っている。タイマは、期限切れになるとコールバックを呼び出します。必要に応じて、有効期限に注意して注文することができます。

+1

独自の実装を構築する必要はありません。すぐに利用できる(よくテストされた)ものを使用してください。たとえば、jQueryプラグイン(http://docs.jquery.com/AjaxQueue)またはスタンドアロンのjavascriptエンジン(http://www.cmarshall.net/MySoftware/ajax/index.html)。 – lsoliveira

+0

@lsoliveiraはい、「ビルド」とは、単にブラウザの実装ではなくJavaScriptで書かれたコードを使用することを意味していました。既存のプラグインを使用することはおそらく、プラグインが動作するフレームワークを既に使用している場合は、おそらく最良の方法です。 – tvanfosson

+0

合意。 OPに代替案があることを知らせたいだけでした。いずれにしても、AJAX呼び出し(setTimeout/setIntervalで起動されたタイマーの一部として実行されるコールバックとは対照的)を参照するかどうかはわかりません。 – lsoliveira

1

すべてのリクエスト(およびレスポンス)にシーケンス番号を含め、すべてのAJAX呼び出しで同じコールバックハンドラを使用することができます。これにより、コールバックハンドラは返されるシーケンス番号をチェックし、コールバックの実行順序を管理できます。

すなわち何かのように:

は、すべてのAJAX要求は

すべてのAJAXの応答、すなわち、配列numは要求を受信した

を返します(ここではJSONを想定)。.. /getUsers?seq=1&.../getProps?seq=2&...などのようになります

var responseQ = []; 
function handler(response) { 
    // .. code to push the response into the responseQ in increasing order of seq num .. 
} 
result { 
    seq: 2, 
    data: ... 
} 

、あなたのコールバックハンドラは次のようになります

、あなたがキュープロセッサはQで優れたレスポンスをチェックして、適切に処理しN秒ごとに、実行させることができ..

すなわちような何か:

JavaScriptがコールバックを置くことができない
setInterval(function() { 

    // get last item from responseQ 
    // check its seq num 
    // execute if appropriate 

}, 10000); 
+0

OPがリクエストをキューに入れたい理由がサーバーアクセスをシリアライズする場合(リッチフェイスがこれを行うなど)、これは動作しません(少なくとも、真剣に拡張する必要があります)。 – lsoliveira

+0

はい、これはかなり拡張する必要があります。私は、AJAXのキューイング戦略を開発するための高度な戦略の概要を指摘していました。 – techfoobar

関連する問題