我有基类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 + '!');
}
它只运行一次并停止。我该如何解决?
答案 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;
在javascript setInterval函数中,可以像setTimeout一样调用间隔时间的无限执行,但是setTimeout将执行一次但不会执行setInterval。我们可以使用clearInteval( - inteval timer variable - )来控制setInterval。