我看到了以下代码:
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();为什么window.setTimeout(() => this.start(), 1000);不引入无限循环?
根据我的理解,cp.start()将首先迭代sensors中的每个sensor,然后调用window.setTimeout,后者在1第二次延迟后再次调用start。
参考:清单3-3。专业TypeScript中的委派:应用程序规模的JavaScript开发
发布于 2016-09-03 05:02:37
简而言之,它不会引入无限循环,因为setTimeout不会阻塞。相反,您赋予它执行的函数() => this.start()将被添加到队列中,并在1秒后执行。start方法在调用window.setTimeout之后返回,因此不会导致命令式意义上的无限循环。大多数情况下,代码将处于等待状态,直到下一个计时器到来。
代码无限地调度一个计时器来调用start方法也是正确的,但它不是无限循环,因为它将控制权返回给javascript运行时。
发布于 2016-09-03 05:00:26
它确实引入了一个无限循环,每次调用之间延迟1秒
window.setTimeout(() => this.start(), 1000);几乎与
var _this = this;
window.setTimeout(function(){ _this.start(); }, 1000);它被称为Arrow Function
发布于 2016-09-03 04:55:11
也许你需要setInterval。这将创建一个无限循环,您可以使用clearInterval清除该循环。
this.interval = window.setInterval(() => {
...
}, 5000);
window.clearInterval(this.interval);你也可以这样做
this.sensors.forEach(sensor => sensor.check())而不是使用for循环。
https://stackoverflow.com/questions/39300551
复制相似问题