0

Document Ready で呼び出される JavaScript 関数がいくつかあります。

fogFields();
getLoS();
getShips();    

startGame();
getNextMove();

ただし、getNextMove() が最初に呼び出されているように見えます。これは、ほとんどの場合、ajax 呼び出しと結果のアラートだけであるためです。他のすべての関数にはより多くの作業があるため、ロード時に最初に発生するのは getNextMove() アラートであり、バックグラウンドで他の関数が作業を行っていないことがわかります。警告ウィンドウで [OK] をクリックするまで、結果は表示されません。関数が終了するまで、次の関数が開始されないようにすることはできますか? 一部の関数は、終了する前に独自の追加関数を呼び出しますが、それは順番に機能しますが、コード全体でそれを行うことはできません...

4

3 に答える 3

3

質問のコードを考えると、その内容に関係なく、終了getNextMoveする前にへの呼び出しを呼び出す方法はありません。startGame

startGameで非同期に (タイムアウト、AJAX コールバックなどを介して) スケジュールされた関数が、 の呼び出しの前または後の任意の時点で完了することは事実ですがgetNextMove、これは別の問題です。この問題を解決するには、関数の内容について詳しく知る必要があります。

于 2013-08-01T20:46:46.237 に答える
0

他の関数に AJAX 呼び出しが含まれている場合、これらの AJAX 呼び出しは、AJAX 呼び出しが終了したときに実行される関数であるコールバック引数を確実に受け取ります。ここで、ある方法で関数を実行したい場合は、前の関数の AJAX 呼び出しが終了したときに 1 つの関数が開始されます。追加のコールバック引数を独自の関数に追加すると、それが AJAX 呼び出しに渡されます。これは私が何を意味するかを説明する必要があります:

function logFields(callback) {
    ajaxCall(callback);
}

function getLoS(callback) {
    ajaxCall(callback);
}

function getShips(callback) {
    ajaxCall(callback);
}

function startGame(callback) {
    ajaxCall(callback);
}

function getNextMove() {
}

fogFields(function(){
    getLoS(function(){
        getShips(function(){
            startGame(function(){
                getNextMove();
            });
        });
    });
});
于 2013-08-01T21:15:34.337 に答える
0

すべての関数が ajax 呼び出しを使用している場合は、promise を使用してください。たとえば、次のように返します。

function fogFields(){
    return $.ajax();
};

次に、.then を使用します。

fogFields().then(getLos());

使用する場合は、 jquery doc ページのdefered オブジェクトに関する詳細情報を参照してください。または、ここで見つけることができる純粋な JavaScript での実装と、ここでより多くの理論を見つけることができます。または、 $.ajax 呼び出しで param
を に設定することはお勧めしません。繰り返しますが、jQuery を使用する場合です。asyncfalse

于 2013-08-01T21:29:20.660 に答える