3

別のプロセスからの応答を待っている Ajax 要求があります。

function test() {
    var flag = 0;
    while (flag === 0) {
        $.ajax({
            url: "cs/CheckForProcess",
            async: false,
            success: function(data) {
                if (data !== 'NotReady') {
                    $('#results').html(data);
                    flag = 1;
                } else {
                    $('#results').html('<h1>Processing...</h1>');
                    setTimeout(function() {
                    }, 6000);
                }
            }
        });
    }
}

問題は、デバッグ モードで else 条件が実行されていることがわかりますが、setTimout が機能していないことです。


編集: プロセスの準備ができていないことを検証してから 6 秒後に、次の ajax リクエストを送信する必要があります。

私は何が欠けていますか?どうも。

4

3 に答える 3

9

setTimeout は非同期関数です。スクリプトは一時停止しません。スクリプトは引き続き実行されます (そして 6000 ミリ秒後に setTimeout コールバック関数が実行されます)。

setInterval を使用して、他の条件が真であることを確認し続けることを検討できます。

サーバーの応答を別の場所で追跡することで、おそらく async:false を削除できます。コールバックが成功したら、間隔をキャンセルする必要があります。

function test() {
    var timerId = 0,
    timerId = setInterval(function(){
        $.ajax({
            url: "cs/CheckForProcess",
            success: function(data) {
                if (data !== 'NotReady') {
                    $('#results').html(data);
                    clearInterval(timerId);
                }
            }
        });
    }, 6000)
}
于 2013-11-03T17:56:49.980 に答える
3

Javascript には、setTimeout を使用してスリープする (たとえば、javascript の実行を中断またはブロックする) 機能がありません。

将来のsetTimeout()ある時点で関数を実行するようにスケジュールすると、他の JavaScript はその間も喜んで実行され続けます。

setTimeout()データがまだ準備できていない場合は、次の ajax 関数の実行をスケジュールするために使用する必要があります。したがって、データの準備ができていない場合は、次の ajax 呼び出しを今から 6 秒後にスケジュールしますが、データを取得したら、データを処理するだけで完了です。

async: falseさらに、ajax 呼び出し中にブラウザーがフリーズする (他の処理を実行できない) ため、実際には使用したくありません。これと同じ操作を記述して、ajax の非同期の性質を活用し、問題を解決しながら、ブラウザーをブロックすることなくブラウザーで他の処理を続行できるようにすることができます。これには、非同期プログラミング技術が必要です。

次のように行うことができます。

function test() {

    function runIt() {
        $.ajax({
            url: "cs/CheckForProcess",
            async: true,
            success: function(data) {
                if (data !== 'NotReady') {
                    $('#results').html(data);
                } else {
                    // if data not ready yet, then put up some progress
                    // and call this again in 6 seconds
                    $('#results').html('<h1>Processing...</h1>');
                    setTimeout(runIt, 6000);
                }
            }
        });
    }

    // start the first iteration
    runIt();
}
于 2013-11-03T17:57:17.050 に答える