setInterval,在Node.js中带有回调函数的setTimeout

时间:2015-12-25 16:55:05

标签: javascript node.js callback

我在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);
},

我得到这样的东西:

等待

等待

等待

等待

等待

东西

等待

东西

等待

东西

任何想法都将受到赞赏。

3 个答案:

答案 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();

DEMO

或者,符合您自己的代码:

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();

DEMO