2016-09-02 5 views
0

私は、次のコードを見た:window.setTimeout(() => this.start(), 1000);が無限ループを導入しないのはなぜ同じ関数のwindow.setTimeoutを呼び出しても無限ループが発生しないのはなぜですか?

class MasterControlPanel { 
    private sensors: Sensor[] = []; 
    constructor() { 
     // Instantiating the delegate HeatSensor 
     this.sensors.push(new HeatSensor(this)); 
    } 

    start() { 
     for (var i= 0; i < this.sensors.length; i++) { 
      // Calling the delegate 
      this.sensors[i].check(); 
     } 
     window.setTimeout(() => this.start(), 1000); 
    } 

    startAlarm(message: string) { 
     console.log('Alarm! ' + message); 
    } 
} 

var cp = new MasterControlPanel(); 
cp.start(); 

を?

私の理解に基づいて、cp.start()は最初sensors内の各sensorを反復して、順番に1秒の遅延後に再度startを呼び出すwindow.setTimeoutを呼び出します。

参考:リスト3-3。 Pro TypeScriptの委任:アプリケーション規模のJavaScript開発

+0

トピックを表示しない: '()=> this.start()'は何かが不思議です - 新しいJSシンタックスでなければなりません。 – Utkanos

+1

これはラムダです。これはES6の新機能です。 – Amy

+2

無限ループを導入しています。 iteratiionsの間にちょうど1秒です。 – Malk

答えて

-1

おそらくsetIntervalが必要です。 それはclearIntervalを使ってクリアできる無限ループを作成します。

this.interval = window.setInterval(() => { 
... 
}, 5000); 

window.clearInterval(this.interval); 

また、あなたが代わりにforループを使用しての

this.sensors.forEach(sensor => sensor.check()) 

を行うことができます。

+0

質問に回答しなかったために下降しました。質問者は質問のコードがなぜ無限にループしているのではなく、どうやってそのようにするのかという質問をしました。その上に、あなたが与えたサンプルコードはOPのコードとまったく同じことをします。 –

-1

setTimeoutでこれを使用することはできません。これはクラスではなく、setTimeoutを参照するためです。 これを試してみてください:

class MasterControlPanel { 
    private sensors: Sensor[] = []; 
    constructor() { 
     // Instantiating the delegate HeatSensor 
     this.sensors.push(new HeatSensor(this)); 
    } 
    var that = this; 
    start() { 
     for (var i= 0; i < this.sensors.length; i++) { 
      // Calling the delegate 
      this.sensors[i].check(); 
     } 
     window.setTimeout(() => that.start(), 1000); 
    } 

    startAlarm(message: string) { 
     console.log('Alarm! ' + message); 
    } 
} 

var cp = new MasterControlPanel(); 
cp.start(); 
+2

setTimeoutのコンテキストは実際にはウィンドウです。これは、cp.start()がウィンドウスコープで実行されたためです。 また、クラス内でstart =()=>を使用すると、クラスコンテキストを自動的にバインドできます。 – gor181

+0

間違った情報のために下落しました。関数のクロージャでこれを使用することができます。これは、外側のスコープにバインドする太字の矢印構文を使用するためです。 –

1

それは無限ループを導入し、

window.setTimeout(() => this.start(), 1000); 

各呼び出しの間で1秒遅れてそれを呼び出して、ほぼ同じ

var _this = this; 
window.setTimeout(function(){ _this.start(); }, 1000); 

ようです Arrow Function

2

要するに、無限ループを導入するものではありません。原因setTimeoutはブロックしません。その代わりに、実行する関数()=> this.start()はキューに追加され、1秒後に実行されます。 startメソッドはwindow.setTimeoutを呼び出した後に戻るため、命令的な意味で無限ループは発生しません。ほとんどの場合、コードは次のタイマーが現れるまで待つ状態になります。

startメソッドを呼び出すタイマーを無制限にスケジュールするコードも当てはまりますが、javascriptランタイムに制御を戻すため、コードは無限ループではありません。

関連する問題