2

私はこれについて多くの投稿を読みましたが、それでも問題を解決することに頭を悩ませることはできません. jQuery.when を見てきましたが、使い方がわかりません。サーバーから ajax 経由でデータを取得し、ページを更新します。返されるデータの量によっては、数秒かかる場合があります。すべてのhtmlがページにロードされるまで、同じajax関数を実行したくありません。それは可能ですか?

ajax リクエストを呼び出す関数を実行するタイマーがあります。

setInterval( "update()", 25000 ); 

これは update 関数内の ajax です

                    $.ajax({
                            type: "POST",
                            url: "/ajax/modify.php",
                            data: "id="+ id +"& action="+ act,
                            success: function(response){
                                //update the html on the page
                            }           
                    }); 

ユーザーがリンクをクリックして、より多くの投稿を取得する方法があります。問題は、ユーザーがそのリンクをクリックしてより多くの投稿を取得した直後にタイマーが発生すると、ページが更新され、ユーザーの要求が中断され、div コンテナーが以前のものでリロードされることです。そのため、応答が完了してページが更新されるまで待ってから、さらに要求を許可する必要があります。

感謝される例。

4

2 に答える 2

3

JQuery の ajax メソッドは promise を返します。これを使用して、コールバックをアタッチできます。この約束を変数に格納できます。関数の成功/失敗時に、変数をクリアできます。これにより、リクエストが現在アクティブかどうかがわかります。変数が関数スコープの外にあることを確認してください。そうしないと、何も役に立ちません。例えば:

var currentRequest = null;

function doUpdate() {
    // don't do anything if there's an active request
    if (currentRequest)
        return;

    currentRequest = $.ajax({
        type: "POST",
        url: "/ajax/modify.php",
        data: "id="+ id +"& action="+ act
    }).then(function(response) {
        // do your UI updates here.
    }).always(function() {
        // whether the call succeeds or not, still clear out the request
        // so that the next call into the function makes a new request
        currentRequest = null;
    });
}
于 2013-02-15T07:00:27.657 に答える
0

このSOの質問を見てくださいjQuery deferreds and promises - .then() vs .done()

jQuery 遅延オブジェクト


実行async:falseするとその目的が失われます。最初の成功のコールバックで次の ajax リクエストを起動できますが、それはクリーンなアプローチではありません IMO

于 2013-02-15T06:54:43.483 に答える