1

私は大きなフォームを持っています。値を変更すると、サーバーへのajax呼び出しがトリガーされ、いくつかの計算が実行され、結果が返されます。しかし、問題は、ユーザーが各ajax呼び出しが終了するのを待たず、そのような呼び出しが数回積み重なった後、最後に取得した結果は、サーバーへの最新の呼び出しではない可能性があることです。 ajax呼び出しは、関連するデータやその他の要因に基づいて変わる可能性があります。ただし、最新の変更に対応するデータをユーザーに提示する必要があります。それで、

1)$ .get()または$ .post()を使用しているときに、このシナリオを回避する方法はありますか?

2)上記の2つの方法で同期/非同期を使用する方法はありますか?または、$。ajax()を使用する必要がありますか?

編集:

単純なajaxメソッドを使用しています

$("#someField").blur(function(e){

    $.get("someURL.php?v="+$(this).val(),function(d){

       $("#result").html(d);
    });

})
4

5 に答える 5

5

以前に呼び出された同じ要求を終了する前に同じ要求を再度呼び出す場合は、prevoius要求を中止して、新しい要求を続行します。

var xhr = null;
$("#someField").blur(function(e){
    if(xhr)xhr.abort();
        xhr=$.get("someURL.php?v="+$(this).val(),function(d){
              $("#result").html(d);
            }).done(function() { xhr = null; });
})
于 2013-03-07T11:39:05.800 に答える
1

2) これを使用して、ajax 呼び出しの同期または非同期を設定できます。

$.ajaxSetup({async: false});

この関数呼び出しの後、次の ajax 呼び出し ($.ajax、$.post、$.get) が同期して実行されます。そして、postでasyncパラメーターを使用し、ajaxメソッドのようにメソッドを取得できると思います。(しかし、確かではありません)

しかし、私はそれをお勧めしません。非同期言語として Javascript を使用する必要があります。以前の呼び出しを停止する必要があります。他のコメンターが書いたように。

于 2013-03-07T11:34:40.570 に答える
0

ajax呼び出しがデータに変更を加えない場合(計算と読み取りのみ)。ajax を再度呼び出す前に、以前の呼び出しを中止しても問題ありません。

于 2013-03-07T11:33:42.317 に答える
0

幸いなことに、jqXHR オブジェクトabort()は基礎となる XMLHttpRequest オブジェクトのメソッドをサポートしているため、未解決/拒否されていない ajax リクエストを中止できます。

これは、前の によって返された jqXHR オブジェクトへの参照を保持することで実行できます$.get()

var blurPromise;

$("#someField").blur(function(e) {
    if(blurPromise) blurPromise.abort();
    blurPromise = $.get("someURL.php?v="+$(this).val(), function(d) {
       $("#result").html(d);
    });
});

このif(blurPromise)テストは、blurPromise が定義されていない場合の初期条件を処理するためにあります。

blurPromise を null にする必要はありません。abort()解決された jqXHR の呼び出しは単純に無視されます。

于 2013-03-07T11:49:36.590 に答える