5

アニメーションを表示するsetInterval呼び出しループがあります。

ユーザー入力にclearInterval応答すると、キューに1つ以上のループコールバックがある可能性があります。ステートメントの直後に関数呼び出しを置くと、関数呼び出しがclearInterval最初に終了し(画面に何かを出力)、次にキューに入れられたループコールバックが実行され、印刷したいものが消去されます。

以下のコードを参照してください。

function loop() {
    // print something to screen
}

var timer = setInterval(loop(), 30);

canvas.onkeypress = function (event) {
    clearInterval(timer);
    // print something else to screen
}

これを処理するための最良の方法は何ですか?// print something else to screen?に遅延を置きます ループ内で新しい印刷を行いますか?

編集:答えてくれてありがとう。将来の参考のために、私の問題は、余分な印刷をトリガーしたイベントがループ内に埋め込まれていたため、これが実行されると、制御が未完了のループに戻され、ループが上書きされたということでした。乾杯。

4

2 に答える 2

2

フラグを使用して、キューに入れられた関数を無視することもできます。

var should;

function loop() {
    if(!should) return; // ignore this loop iteration if said so

    // print something to screen
}

should = true;
var timer = setInterval(loop, 30); // I guess you meant 'loop' without '()'

canvas.onkeypress = function (event) {
    should = false; // announce that loop really should stop
    clearInterval(timer);
    // print something else to screen
}
于 2011-10-01T14:20:38.707 に答える
2

まず第一に、あなたはおそらく次のことを意味していました:

var timer = setInterval(loop, 30);

次に、呼び出しclearIntervalによって保留中のloop()呼び出しのキューが消去されないことを確認しますか? この場合、何らかのガードを使用してこれらの呼び出しを簡単に無効にすることができます。

var done = false;

function loop() {
    if(!done) {
      // print something to screen
    }
}

var timer = setInterval(loop(), 30);

canvas.onkeypress = function (event) {
    clearInterval(timer);
    done = true;
    // print something else to screen
}
于 2011-10-01T14:20:54.503 に答える