在javascript上运行计时器

时间:2016-12-30 17:33:42

标签: javascript jquery timer

我有基类Timer和里面的几个方法。我的想法很简单,我需要一个基本类来运行计时器。很多不同的计时器作为基类的实例。但我不知道如何将方法作为参数传递到.startTimer.run

function Timer(interval) {
        this.isTimerRuns = false;
        this.timerId = 0;
        this.interval = interval;
    }

Timer.prototype.run = function (foo) {
    if(this.isTimerRuns){
        foo();
        setTimeout(this.run(foo), this.interval);
    }
    else{
        this.stopTimer();
    }
};

Timer.prototype.startTimer = function (foo) {
    this.timerId = setTimeout(this.run(foo), this.interval);
    this.isTimerRuns = true;
};

Timer.prototype.stopTimer = function () {
    clearInterval(this.timerId);
    this.isTimerRuns = false;
    this.timerId = 0;

};

Timer.prototype.ajaxCall = function (url, method, successFunc, errorFunc) {
    $.ajax({
        url: url,
        type: method,
        success: function (data) {
            var respond = JSON.parse(data);
            successFunc(respond);
        },
        error: function () {
            if(errorFunc != null){
                errorFunc();
            }
        }
    });
};

当我尝试像这样运行我的垃圾时:

    var t = new Timer(10000);
    t.startTimer(t.ajaxCall("/123", "POST", test2, null));

function test2(resp) {
    console.log(resp + '!');
}

它只运行一次并停止。我该如何解决?

2 个答案:

答案 0 :(得分:3)

它会运行一次,因为您执行该函数而不是将其作为参数传递:

这样做:

t.startTimer( function() { t.ajaxCall("/123", "POST", test2, null); });

假设您的其余代码符合您的要求,那应该可以解决问题。

答案 1 :(得分:0)



function Timer(interval) {
        this.isTimerRuns = false;
        this.timerId = 0;
        this.interval = interval;
    }
Timer.prototype.startTimer = function (foo) {
	this.isTimerRuns = true;
    this.timerId = setInterval(foo, this.interval);
    
};

Timer.prototype.stopTimer = function () {
	clearInterval(this.timerId);
    this.isTimerRuns = false;
    this.timerId = 0;

};

Timer.prototype.ajaxCall = function (url, method, successFunc, errorFunc) {
    $.ajax({
        url: url,
        type: method,
        success: function (data) {
            var respond = JSON.parse(data);
            successFunc(respond);
        },
        error: function () {
            if(errorFunc != null){
                errorFunc();
            }
        }
    });
};

function test2(resp) {
    console.log(resp + '!');
}

  var t = new Timer(1000);
    t.startTimer(function(){t.ajaxCall("/123", "POST", test2, null)});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
&#13;
&#13;
&#13;

在javascript setInterval函数中,可以像setTimeout一样调用间隔时间的无限执行,但是setTimeout将执行一次但不会执行setInterval。我们可以使用clearInteval( - inteval timer variable - )来控制setInterval。