2016-05-04 21 views
1

私は、ユーザーがchromeの複数のタブ内をナビゲートするイントラネットサイトを持っています。それらの中には、一定間隔で大量のデータをロードするために複数の重大なAjaxコールを同時に実行するものがあります。Jquery abort()が完全に解放されていないようです

ページの可視性APIを使用して、インターバルが発生したときにタブが選択されていない場合は、間隔をリセットするだけです。それ以外の場合は、データをリフレッシュします。

私は最近、リフレッシュの途中である場合に、ページの可視性が失われたときにajax呼び出しを中止するコードを追加しました。

私が発見したことは、たとえ私がajaxコールを中止しても、このクライアントからのサーバへの後続のリクエストが座って回転するのに時間があることです。サーバーあたりのmax-connectionsがabort()でリセットされていないかのようです。 (編集:サーバーはまだ処理中ではないが、ブラウザは要求をキューから取り出して処理できることを認識していないようだ。)

誰もがこれまでに遭遇した修正を持っていますか?

答えて

1

残念ながら、クライアントサイドのajaxリクエストを中止しても、サーバはリクエストを処理できません。実際には、サーバーは要求がクライアントによってまったく打ち切られたことさえ知らない。

一部のサーバー側のフレームワークでは、クライアントがまだ接続されているかどうかを確認できますが、それは最高では信頼できません。

中止しているセッションIDに関連付けられている実行中のプロセスを強制的に停止するようサーバーに通知する最初のセッションを中止したときに、サーバーに対して2次ajax要求を開始することで回避できます。それはあなたがデータを更新する責任があるプロセスを殺すために必要がある場合は特に、しかし少しトリッキー得ることができます - あなたが行われたすべての変更をロールバックし、データの整合性を維持していることを保証する必要があるだろう、など

+0

私はサーバーについて心配していないのですが、それはクライアントであり、同時リクエスト数がユーザーを苛立たせます。クロムのサーバーごとの最大接続数のために、サーバーが「思わしくない」と思われます。中断すると、ブラウザが再び使用するための接続が解放されていないようです。 –

+0

あなたのxhrオブジェクトはまだどこかで参照され、ガベージコレクションによってクリーンアップされないようにぶら下がっている可能性がありますか?接続がリセットされないことがあります。変数をヌルに手動で設定して、残っている参照を取り除くことができます。 – Joel

+0

いい考えですが、コンソールを使用してxhrオブジェクトをnullに設定しても、保留中の要求を急ぐようには見えません。 –

関連する問題