13

AJAX リクエストをキャンセルする簡単な方法があるかどうか疑問に思っていましたか?

クライアント側の XMLHTTPRequest で「中止」を呼び出すだけでなく、サーバー プロセスを簡単に停止する方法はありますか? サーバーはApacheを使用しています。

ありがとう

4

7 に答える 7

7

いいえ、簡単な方法は絶対にありません。

いくつかの複雑な方法を考えることができますが、それらは信頼できません。

実行したばかりのリクエストからの変更を元に戻すためのプロセスを開発することで、おそらくより多くの幸運が得られるでしょう(それが、停止したい理由だと思います)。

于 2009-04-28T20:44:38.883 に答える
4

別の Ajax リクエストを開始します。別のリクエストが呼び出されたときに前のリクエストが中断されないようにする方法を見つけようとして、このスレッドを見つけました。

于 2010-01-11T01:34:22.530 に答える
1

ネットワーク経由でリクエスト自体を停止する良い方法はありませんが (多くの人が言っているように)、リクエストの影響を停止するのは比較的簡単です。すなわち

サーバー側: exitCookie やセッションなどのグローバル変数 (フラグとして機能する) を常にチェックすることで (またはスクリプトを強制終了するために必要な任意の用語) 可能です (スクリプトの実行中にこれらが変更されると仮定します)。さらに、ファイルまたはデータベース エントリをフラグとして保持することもできます (存在をポーリングできます)。

クライアント側:呼び出すことができますabort(他の人が言ったように、すべてのブラウザーで機能するわけではありません)、またはコールバックの上部にグローバルセマフォ/フラグを保持できます(グローバル値をチェックして、まだ実行する必要があります)。例:

 window.ajaxIsStillGood = true;

 xhr.onreadystatechange = function( )
 {
     if( 4 === xhr.readyState && 200 === xhr.status )
     {
         if( true === window.ajaxIsStillGood ){ /* still good */ }
     }
 }

 /* bad stuff happens */

 window.ajaxIsStillGood = false; // now the code won't execute
于 2010-01-28T02:46:00.110 に答える
1

PHP の場合、 を使用して停止または中止する方法を見つけましたsession_write_close();session_start()これをスクリプトの後に置くだけです。フレームワークまたは OOP を使用している場合は、それをメソッドの最初の行として保持します。これは、ajax が完了するまでセッション データがロックされているために発生します。

テスト後、別のページが読み込まれるようになりましたxhr.abort()

ここにある解決策のヒント jQuery を使用して Ajax リクエストを中止する

于 2017-12-07T12:20:10.653 に答える
0

最も簡単な方法は、503 (または同様の) HTTP 応答ヘッダーを送信し、サーバー側アプリケーションを中止する (または単にアプリケーションを中止する) ことです。データが送信されなかった、および/または HTTP 応答ヘッダーのクライアント側をチェックしたと仮定すると、失敗した要求として扱うことができます。

于 2009-04-28T20:48:21.930 に答える
0

短い答えは「いいえ」です。サーバー側で非常に長時間実行されているバックグラウンド プロセスについて話している場合を除き、その場合、2 番目の Ajax リクエストで停止を開始できます。しかし、Apache/PHP サーバーへの通常のリクエストについて話しているのであれば、いいえ... リクエストがどの Apache スレッドで実行されているかを特定するだけでも十分に面倒です。

プロセスを開始する前に、何らかの形で Ajax リクエストを検証する方がはるかに簡単です。それが実行したいものであることを確認してください。ユーザーが行っていることを中断できないことをユーザーに認識させる必要がある場合は、Javascript 確認プロセスを使用することもできます。

スティーブンが投稿したように、リバース プロセスを持つことは、あなたの利益にもなるように思えます。

于 2009-04-28T20:50:35.467 に答える