我在Node.js中编写了一个应用程序,它将像模拟器游戏fg一样引擎。足球比赛。我希望有#34;在线广播"因此我创建了如下功能。 我想知道为什么我的代码不能正常工作。我期待的是:
等待
等待
等待
等待
等待
东西
等待
等待
等待
等待
等待
东西
等待
等
但我不知道我的代码有什么问题,看看这个:
getText: function() {
console.log("something");
},
setDelay: function(callback) {
var that = this;
setTimeout(function() {
callback();
},5000);
},
play: function() {
var that = this;
setInterval(function(){
console.log("wait");
that.setDelay(that.getText);
},1000);
},
我得到这样的东西:
等待
等待
等待
等待
等待
东西
等待
东西
等待
东西
等
任何想法都将受到赞赏。
答案 0 :(得分:2)
这是因为您每秒都在呼叫setDelay()
:
getText: function() {
console.log("something");
},
setDelay: function(callback) {
var that = this;
setTimeout(function () {
callback();
}, 5000);
},
play: function() {
var that = this;
setInterval(function () {
console.log("wait");
that.setDelay(that.getText); // << here
}, 1000);
},
会发生什么:
1s - &gt; setDelay() - &gt; timeout1已创建
2s - &gt; setDelay() - &gt; timeout2已创建
3s - &gt; setDelay() - &gt; timeout3已创建
4s - &gt; setDelay() - &gt; timeout4已创建
5s - &gt; setDelay() - &gt; timeout5已创建
6s - &gt; setDelay() - &gt; timeout6已创建// timeout1&#39;已完成5s,因此它会触发 7s - &gt; setDelay() - &gt; timeout7已创建// timeout2&#39;已完成5s,因此它会触发 8s - &gt; setDelay() - &gt; timeout8已创建// timeout3&#39;已完成5s,因此它会触发 等等...
答案 1 :(得分:1)
在play
功能的内部,您每秒都在运行that.setDelay
,然后等待五秒钟才开始运行console.log("something");
。
你可以做的是运行两个setInterval
:
play: function() {
var that = this;
setInterval(function () {
console.log("wait");
}, 1000);
setInterval(function () {
that.getText();
}, 5000);
},
这样,每秒你都会得到输出“等待”,每隔五秒就输出一次“东西”。
圣诞快乐!
答案 2 :(得分:1)
我会尝试取消两个混合的超时/间隔,并且只有一个在达到循环限制后清除/重置。它使它更容易遵循。像这样:
function play(count) {
var count = count || 1;
var t;
console.log(count);
if (count !== 0 && count % 5 === 0) {
clearTimeout(t);
console.log('something');
t = setTimeout(play, 5000, 1);
} else {
t = setTimeout(play, 1000, ++count);
}
}
play();
或者,符合您自己的代码:
var obj = {
delay: 5000,
timer: 1000,
getText: function () {
console.log('something');
},
play: function(count) {
var count = count || 1;
var t;
if (count !== 0 && count % 5 === 0) {
clearTimeout(t);
this.getText();
t = setTimeout(this.play.bind(this), this.delay, 1);
} else {
t = setTimeout(this.play.bind(this), this.timer, ++count);
}
}
}
obj.play();