30

ユーザーが別のページに移動した場合に中止したい (潜在的に) 長時間実行される ajax 呼び出しがいくつかあります。次の jQuery コード呼び出しは、ページから離れたときに、保留中のすべての XMLHttpRequest オブジェクトを中止します。

$.ajaxSetup({
    beforeSend: function(xhr) {
        $(window).bind('beforeunload', function() {
            xhr.abort();
        });
    }
});

テスト ケースでは、呼び出されるサーバー側の操作を 10 秒間待機させます。Firebug を使用して、ページ上のリンクをクリックすると、上記のコードによって保留中のすべての ajax 呼び出しがすぐに停止することを確認しました。ただし、ブラウザは次のページに移動する前に 10 秒間待機します。IE も同じ動作を示すようです。これはブラウザの既知の動作ですか? この状況で、ユーザーがページからすぐに移動できるようにできることはありますか? 前もって感謝します。

4

7 に答える 7

31

返信ありがとうございます。これがブラウザの問題であることについて、私は完全に間違っていたことが判明しました。問題はサーバーにありました。ASP.NET は、セッション状態を必要とする同じセッションの要求をシリアル化するため、この場合、これらの ajax によって開始された要求が完了するまで、次のページはサーバーで処理を開始しませんでした。

残念ながら、この場合、ajax 呼び出しに応答した http ハンドラーでセッション状態が必要になります。ただし、読み取り専用アクセスで十分であるため、ハンドラーを IRequiresSessionState ではなく IReadOnlySessionState でマークすることにより、セッション ロックが保持されず、問題が修正されます。

この情報が他の人に役立つことを願っています。

于 2009-06-09T15:36:00.370 に答える
12

この質問に対するトッド自身の答えについて...

私はPHPでこの問題を抱えていましたが、同じ解決策が機能していました。しかし、私はセッションで情報が必要でした。PHP開発者の場合session_write_close()、リクエストの途中でセッションを閉じて書き出すために呼び出すことができます。これにより、セッションが他のリクエストのために解放されます。

于 2010-07-19T18:36:10.640 に答える
3

abort() の奇妙な副作用を確認したい場合があります

abort() メソッドが使用されると、readystatechange イベントが Explorer および Mozilla で発生します。さらに悪いことに、readyState = 4 です。これは、平均的な xmlhttp スクリプトが、データが正しく読み込まれたと想定していることを意味します。これにより、非常に奇妙な効果が得られます。

ここに文書化されています:

http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html

于 2009-06-04T16:52:39.293 に答える
2

非同期リクエストを使用していることを確認しますか?リクエスト全体でブラウザがブロックする場合は、同期リクエストを使用しています(非同期パラメータはfalseです)

于 2009-06-02T21:51:35.507 に答える
1

サーバーの問題は、私が使用している Apache/Php サーバーにも当てはまります。それを必要としないスクリプト (AJAX) の session_start を削除し、すべてが期待どおりに機能しています。同様の問題を指摘してくれた Todd に感謝します。

于 2010-06-22T19:56:25.213 に答える
0

受け入れられた回答への参照:

http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/

IRequiresSessionState

つまり、特定のセッションで同時に実行できるリクエストは 1 つだけです。同じセッションからの他のリクエストはブロックされ、セッションが解放されるのを待ちます

于 2015-03-24T10:40:14.060 に答える