【发布时间】:2015-03-28 22:43:14
【问题描述】:
在 if 语句中,我希望间隔清除自身,然后再次调用自身的对象函数以重新启动间隔。
这样的事情可能吗?
我尝试过这种方式,但出现了意想不到的行为。我可以看到日志每 200 毫秒记录一次。虽然它应该已经停止,因为间隔停止并重新启动,并且条件不再评估为真。
DateTime.prototype = {
start: function () {
var self = this;
sendAjaxRequest(this.timeUrl, function () {
var previousTime = new Date().getTime();
this.tickIntervalId = setInterval(function tick() {
var currentTime = new Date().getTime();
if ((currentTime - previousTime) < 0) {
console.log('You changed your time backwards. Restarting.');
self.stop(); // <-- stopping itself
self.start(); // <-- call to same method its running from
return;
}
self.dateElement.innerHTML = new Date();
previousTime = currentTime;
return tick;
}(), 200);
});
},
stop: function () {
clearInterval(this.tickIntervalId);
this.tickIntervalId = null;
}
}
【问题讨论】:
-
我认为您在使用 IIFE 模式时遇到了一些问题。我会在范围之外定义刻度函数,并在 setTimeout 中按名称而不是通过调用来引用它。
-
也许将
this.tickIntervalId更改为self.tickIntervalId就足够了。this在 JS 的很多作用域里有很多不同的含义。
标签: javascript oop scope setinterval