2011-01-13 17 views
10

Javascript/JQueryの非同期性に問題があります。jqueryを使用した複数のajaxリクエスト

以下のように言います(レイテンシは考慮されません)。

私は1つのページに3つのボタン(A、B、C)を持っています。それぞれのボタンはショッピングカートにアイテムを1つ追加し、それぞれ1つのajax-requestを要求します。 は、私はサーバーサイドスクリプト(PHP)での5秒の意図的な遅延時間を置くと離れて1秒でボタンを押すと、私は結果は次のようになりたい:

Request A, 5 seconds 
Request B, 6 seconds 
Request C, 7 seconds 

しかし、結果はこの

ようなものです
Request A, 5 seconds 
Request B, 10 seconds 
Request C, 15 seconds 

これは、要求がキューに入れられていて同時に実行されていないことを意味しています。これはasyncとは逆のものではありませんか?私はまた、URLにランダムなget-parameterを追加して、リクエストにいくつかの一意性を強制しましたが、幸運はありません。

これについて少しお読みになりました。同じ "要求オブジェクト(?)"を使用しない場合、この問題は発生しません。 JQueryでこの動作を強制することは可能ですか?

これは私もGETやPOST、違いはありません両方試してみました私は

$.ajax(
{ 
    url : strAjaxUrl + '?random=' + Math.floor(Math.random()*9999999999), 
    data : 'ajax=add-to-cart&product=' + product, 
    type : 'GET', 
    success : function(responseData) 
    { 
    // update ui 
    }, 
    error : function(responseData) 
    { 
    // show error 
    } 
}); 

を使用していたコードです。

ボタンをクリックした直後にリクエストを送信するようにしました。以前のリクエストが完了したときではなく、リクエストが送信されます。私はリクエストをキューではなく同時に実行したい。

+1

ここにJavaScriptコードを掲載できますか?デフォルトでは '$ .ajax'はasync –

+0

@Emilで、Math.Randomなどを削除して' cache:false'を使用します。 – Anders

+0

jqueryは呼び出しごとに新しい非同期接続を使用すると考えました。 –

答えて

8

ここで私が試してみたいことは、あなたがより良い方法で時間を記録する必要があると思います。私は時をテストするために今何をしているのか分かりませんが、ここは良い方法です。

Firefox用のFirebugを入手していない場合は、入手してください。

Firebugを開いて、[ネット]タブに移動します。有効にしてください。

各ボタンをクリックすると、各リクエストが表示されます。各ボタンをクリックすると、前のリクエストが終了するまで次のリクエストが表示されません。これはjavascriptに問題があることを示します。しかし、私はあなたが1秒ごとに離れている各バーの開始点を推測しています。これを行い、あなたが見ていることを私たちに知らせてください。

編集

私はあなたの問題を発見したと思います。私はあなたがPHPでスリープ関数を使用していると思います。 sleep関数は、現在のセッションでスリープします。 3つのタブを開き、ajax urlを置くと、同じ動作に気付くでしょう。 5,10,15秒ごとに各タブを終了します。私はグーグルで試して、他の人と同じ結果を見つけました。これは、おそらくPHPがマルチスレッド化されていないためです。私は別のフレームワークを使用することをお勧めします。

+0

私はFirebugを使って時間を記録します。明らかに思っていた、この目的のためのノブではない。 – Emil

+0

ネットタブのスクリーンショットを表示できますか? –

+0

http://data.fuskbugg.se/dipdip/_net.png – Emil

0

あなたがjsの異なる範囲にいない場合にのみ、Parallel ajaxの呼び出しを行うことができます。同じjsスコープ内にいると、同じ '要求オブジェクト'をシリアル化の方法で使用できるように見えます。

私たちはこのページのリンクで2つの優れた応答を見つけることができます。並列クエリスタックオブジェクトの2番目の応答を参照してください。これは必要なもので、この並列スタックにリクエストを追加すると、並行して解凍されます(スタックオーバーフローはウェブ上で最高のサイトです:-))。 Parallel asynchronous Ajax requests using jQuery

+0

私は、それをチェックします、ありがとう! – Emil

+0

他のスレッドに表示されているコードは、ループ内のコードであり、ループ内のajax呼び出しです。私は、最初の応答がループである場合、第2の例は、クエリキューを処理するオブジェクトを提供し、このオブジェクトを使用してあなたのニーズに合っている場合は、 – Emil

+0

を衝突することなく "お互いの隣に"実行する各イベントで1つのAJAX呼び出しをしたいおそらくjsスコープに依存しない方法でクエリのキューを格納するためにjQuery.dataを使用する必要があります。 – regilero

0

あなたは、同時にそれを行うJSが原因1つのブラウザUIスレッドに偽の非同期操作を持っている原因傾けます。しかし、ブラウザUIスレッドのコードを実行する方法であるWebワーカーを試すことができます。 Firefox 3.5、Chrome 3、およびSafari 4で既にサポートされています。 アプリケーションのユーザビリティを向上させるかもしれません。

3

明らかに、この動作はsession_write_close()を使用すると簡単に受け入れられます。 PHPで。しかし、これは容易にDDoS攻撃を可能にします。私は10秒でF5を押してページをリフレッシュし、開発者のコ​​ンピュータを無事に殺しました。

ケースが閉じられました。

+0

Emil私は多くの時間を費やしてあなたを見つけました解決策。しかし、あなたは同じ答えを書いて、それを正しいものとして受け入れました。あなたは自分の代わりにコミュニティのメンバーに信用を与えることができました。 –

+0

完了、申し訳ありません。アミールに助けてくれてありがとう!ほんとうにありがとう! :) – Emil

関連する問題