6

次のように、実行時間の長いjQuery Ajax呼び出し(たとえば5秒)があるとします。

$.ajax({
    url: '/LongCall',
    type: 'POST',
    async: true,
    cache: false,
    datatype: 'json',
    success: function(data) {
      alert('Success!');
    },
    error(xhr, textStatus, errorThrown) {
      alert('Error!');
    }
});

ここで、5秒間のプロセスが実行されるのを待っている間に、ユーザーが焦り、ページで何らかのナビゲーションを実行することにしたとします。上記の呼び出しで発生するのは、ユーザーがリンクをクリックするとエラーアラートを受け取ることです。

本当にエラーが発生した場合にエラーアラートを表示したいのですが、ユーザーが移動することを決定しただけの場合は、エラーアラートを表示したくありません。これどうやってするの?

言い換えれば、発生したエラーは単にプロセスが中断されたためにエラーを無視することができるということを教えてくれる、チェックできる値(xhr.statusかもしれませんか?)はありますか?

ありがとう!

4

2 に答える 2

8

私が知る限り、これを行う最良の方法は、エラーハンドラーでxhr.readyStateをチェックすることです。4未満の値は、プロセスがまだ実行中であることを示します。これは、ブラウザで何かが発生してプロセスが中断されていることを意味します。

また、xhr.abort()を呼び出して、ajaxプロセスを停止しようとします。これにより、ユーザーは、ナビゲーションが実際に行われる前にプロセスが終了するのを待つ必要がなくなります。ただし、私にとっては、xhr.abort()の呼び出しは実際には行われません。物事をスピードアップします。

$.ajax({
    url: '/LongCall',
    type: 'POST',
    async: true,
    cache: false,
    datatype: 'json',
    success: function(data) {
      alert('Success!');
    },
    error(xhr, textStatus, errorThrown) {
       if (xhr.readyState < 4) {
           xhr.abort();
       }
       else {
           alert('Error!');
       }
    }
});
于 2013-03-05T00:52:59.403 に答える
3

ドキュメントを読むと、エラーハンドラは次のようになるはずだと推測するのは危険です。

error(xhr, textStatus, errorThrown) {
    if( textStatus != "abort") {
        alert("Error!");
    }
}
于 2013-03-04T23:04:22.580 に答える