【问题标题】:setInterval(): How to stop then start itself again?setInterval():如何停止然后重新开始?
【发布时间】: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


【解决方案1】:

我认为 setInterval 调用的范围是错误的。

尝试改变

this.tickIntervalId = setInterval(function tick() {

使用自我

self.tickIntervalId = setInterval(function tick() {

【讨论】:

  • 你的意思是selfthat 不存在。
猜你喜欢
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多