1

以下の私の質問を更新しました

ユーザーが大量のデータをインポートできるスクリプトを作成しました。フォームが送信され、データが検証された後、2 つのバックグラウンド タスクを追加します。1 つは、すべてのデータをインポートするスクリプトです。このスクリプトはまた、データベースに合計数と彼が実行した数を知らせます。2 つ目は、データベースからどれだけの処理が行われたかを読み取り、それを素敵なプログレス バーに表示するスクリプトです。

コード:

$.ajax({
    type: "GET",
    url: "import-process.php",
    success: function(data) {}
});

var process = 0;
var checkPercentage = function() {
    $.ajax({
        type: "GET",
        url: "get-process-status.php",
        data: "importcode=123456",
        success: function(data) {
            if (!data.indexOf("ERROR") !== -1) {
                process = data;
                $("#process_balk").css('width', process + '%');
            }
        }
    });

    if (process != 100) {
        setTimeout(checkPercentage, 1000);
    } else {
        window.location.href = "import-finished.php";
    }
}

checkPercentage();

どちらのスクリプトも正常に動作します。ただし、最初のスクリプト (データのインポート) が完了した後、2 番目のスクリプト (プロセスのステータスを取得する) は開始されません。それは完全なものをちょっと役に立たなくします。

これを解決する方法はありますか?

更新: バックグラウンド プロセスが 1 回だけ呼び出されることがわかりました。それが問題です。私はそれを修正する方法がわからない..

var checkPercentage = function() {
    alert("Is this function getting called every second?");
    $.ajax({
        type: "GET",
        async: true,
        url: "required/get-process-status.php",
        data: "importcode=123456",
        success: function(data) {
            alert(data);
        }
    });
    setTimeout(checkPercentage, 1000);
}

上記のコードは、「この関数は毎秒呼び出されていますか?」と警告します。一秒ごと。そうあるべきです。ただし、値「data」は一度だけ呼び出されます。それは私が期待したものではありません..何かアイデアはありますか?

4

2 に答える 2

0

このような意味ですか?:

$.ajax({
    type: "GET",
    url: "import-process.php",
    success: function(data) {
        checkPercentage();
    }
});

var process = 0;
var checkPercentage = function() {
    $.ajax({
        type: "GET",
        url: "get-process-status.php",
        data: "importcode=123456",
        success: function(data) {
            if (!data.indexOf("ERROR") !== -1) {
                process = data;
                $("#process_balk").css('width', process + '%');
            }
        }
    });

    if (process != 100) {
        setTimeout(checkPercentage, 1000);
    } else {
        window.location.href = "import-finished.php";
    }
}

checkPercantage 関数呼び出しをスクリプトの最後からsuccess最初の ajax の関数に移動しました。completeエラーがあっても実行したい場合は、機能するように移動することもできます。

于 2013-02-28T17:05:39.860 に答える
0

コールバック関数を次のように設定します。

success: function(data) {
        if (!data.indexOf("ERROR") !== -1) {
            process = data;
            $("#process_balk").css('width', process + '%');
            if (process != 100) {
               setInterval(checkPercentage, 1000);
            } else {
               window.location.href = "import-finished.php";
            }
        }
    }

まず、if ステートメントは、希望どおりに動作するようにコールバック関数に含める必要があります。第二に、間隔ごとに再チェックするため、setInterval()代わりに使用する必要があります。setTimeout()

また、yabol は、コードの上部が次のようになるべきだと言っています。

$.ajax({
type: "GET",
url: "import-process.php",
success: function(data) {
    checkPercentage();
}
});
于 2013-02-28T17:06:54.953 に答える