4

私は2つの関数を持っています.1つはものを選択し、もう1つは次のように遅延して評価します:

function select() {
    // selecting stuff
    window.setTimeout(evaluate, 1000);
}
function evaluate() {
    // evaluating stuff
}

問題は、2番目の機能が完了するまで選択機能を無効にする必要があることです。Javascript を完全に一時停止することは不可能であることはわかっていますが、他の関数が待機中または動作中に最初の関数が起動すると、すべてが台無しになります。すでにコードを他の関数に移動して遅延させようとしましたが、何も機能しません。

前もって感謝します!

4

3 に答える 3

1

誰が不可能だと言った?ID を保存して追跡することで、タイマーが現在実行されているかどうかを確認できます。

var timeout = null;
function select() {
    if( timeout ) { // check if the timer ID is set
        return;
    }
    // selecting stuff
    timeout = window.setTimeout(evaluate, 1000); // return the ID of the timer
}
function evaluate() {
    // evaluating stuff
    window.clearTimeout(timeout); // clear the timer ID
    timeout = null; // reset the timer ID
}
于 2016-03-21T00:16:20.447 に答える
1

この問題はコールバックを使用する必要があると思います。コールバックは、別の関数が実行された後に実行される関数です。このようにして、他の関数が実行された後に関数が実行されることを保証します。また、どのようにデータを取得していますか?SQL 関数の多くには、他の関数を呼び出すために使用できるコールバック (成功) 関数が組み込まれています。コールバック地獄に陥る可能性がありますが、他の関数 callback を使用してデータの処理を続行します。

ここの優れた記事:

http://dreamerslab.com/blog/en/javascript-callbacks/

于 2016-03-21T00:17:53.987 に答える
1

この種の状況を処理する正しい方法は、promise を使用することです。私は Q ライブラリ ( https://github.com/kriskowal/q ) を使用することを好みますが、もちろん jquery も使用できます。select を実行し、評価を実行して、評価が完了するまで select を無効にするとします。

 var deferred = jQuery.Deferred();

 function select() {
     if (deferred.state() === "pending") {
      console.log("Evaluate not finished");
    } else {
       // select stuff
        evaluate(deferred.promise());
    }
}

function evaluate(promise) {
    // evaluating stuff
    promise.resolve();
}
于 2016-03-21T00:36:05.907 に答える