1

私はこのように設定された関数を持っています

awesomeFirePenguin: function(){
   // function does some stuff, not important
},

そして、このように for ループで呼び出します

for (var i = 0; i < n; i++){
   this.awesomeFirePenguin();           
}

これは機能し、関数はn何度も呼び出されますが、関数の結果はすぐに表示されます。私が望むのは、結果が100ミリ秒程度のわずかな遅延で次々に表示されることです。このようなもの

for (var i = 0; i < n; i++){
   this.awesomeFirePenguin(); 
   // wait a while and then continue    
}

使ってみた

for (var i = 0; i < n; i++){
    window.setTimeout(this.awesomeFirePenguin(), 100);
}

window.setInterval(this.awesomeFirePenguin(), 100);、ただしどちらも関数を 1 回だけ実行します。

4

2 に答える 2

3

setTimeout関数をsetInterval引数として取ることができますが、あなたがしていたことはそれらを呼び出すことです。したがって、彼らは関数ではなく、その戻り値を引数として受け取っていました。

スタックを遅延させたい場合は、現在のループ インデックスをタイムアウト遅延に掛けるだけです。

for (var i = 0; i < n; i++){
    window.setTimeout(this.awesomeFirePenguin.bind(this), 100 * i);
}
于 2013-07-24T18:04:09.693 に答える
2

voithosによる答えは、おそらく最も単純です。Clumpy.jsのような非同期実行ライブラリを使用して、コードを次のように記述することもできます。

var clumpy = new Clumpy({delay: 100});
var i;
clumpy.for_loop(
    function() { i = 0; },
    function() { return i < n; },
    function() { ++i; },
    this.awesomeFirePenguin
);

クロージャーと自己呼び出し関数を使用してこれを行うこともできますが、理解するのが難しい醜いコードです。

(function loop(i, f) {
   setTimeout(function () {
      f();
      if (--i) loop(i, f);
   }, 100)
}(n, this.awesomeFirePenguin));

setIntervalの代わりに を使用して何かを記述することは可能setTimeoutですが、おそらく再帰呼び出しを排除することはできますが、理解するのはそれほど簡単ではありません。

于 2013-07-24T18:19:39.537 に答える