【问题标题】:Javascript - Call function after last timeout in a loopJavascript - 在循环中最后一次超时后调用函数
【发布时间】:2017-04-19 23:08:16
【问题描述】:

我目前有一个每秒动画HTML元素的循环,在最后一个动画完成后,我想接受用户输入:

playSequence(currentLevel) {
  console.log("playing level " + currentLevel)
  for (var q = 0; q < currentLevel; q++) {
    (function(q) {
      setTimeout(function() {
        var active = '#' + sequence[q].toString(); //the div currently being animated
        console.log(active);
        var currentColor = $(active).css('background-color');
        var newColor = currentColor.replace("0.6", "1.0");

        $(active).animate({
          backgroundColor: newColor
        }, 100, function() {}).delay(900).animate({
        backgroundColor: currentColor
        }, 100, function() {
        if (q === (currentLevel - 1)) {
          console.log("done"); //this runs
          this.getInput(1, currentLevel); //this does not
        }
      });

     }, 1000 * q)
   }(q));
 }    
}

在最后一个动画之后,打印“done”,但没有调用 getInput,因为函数开头的 console.log 没有打印。

为什么在最后一个计时器结束后它不运行,即使上面的 console.log 运行了?

但是,如果我像这样移动 getInput,

playSequence(currentLevel) {
  console.log("playing level " + currentLevel)
  for (var q = 0; q < currentLevel; q++) {
    (function(q) {
      setTimeout(function() {
        var active = '#' + sequence[q].toString(); //the div currently being animated
        console.log(active);
        var currentColor = $(active).css('background-color');
        var newColor = currentColor.replace("0.6", "1.0");

        $(active).animate({
          backgroundColor: newColor
        }, 100, function() {}).delay(900).animate({
        backgroundColor: currentColor
        }, 100, function() {
        if (q === (currentLevel - 1)) {
          console.log("done"); //this runs

        }
      });

     }, 1000 * q)
   }(q));
 }
this.getInput(1, currentLevel); //this runs   
}

然后 getInput 确实运行了,但是它没有按我的意愿运行,因为它在动画完成之前运行,因为它在 timeOut 的范围之外运行。

注意:这包含在 React 类中,getInput 不是 playSequence 中的方法,它们都在一个名为“Game”的类中

【问题讨论】:

  • 这是一个上下文问题,在第一个示例中this 指的是active 元素,而在第二个示例中它指的是playSequence 函数的上下文。
  • 这包含在 React 类中,getInput 不是 playSequence 中的方法,它们都在一个名为“Game”的类中
  • 如果您在所有匿名函数中都使用var t = this;,则可以在其中使用t.getInput()
  • @PHPglue 谢谢你,这行得通!

标签: javascript function loops reactjs timeout


【解决方案1】:

@PHPGlue 的评论有效,留下他们的答案,以防将来有人偶然发现它:

如果你这样做 var t = this;最重要的是你可以在其中使用 t.getInput() 的匿名函数

【讨论】:

  • 我删除了“这是匿名函数中的窗口”。在意识到这是 jQuery 之后的评论,以便在其他上下文中调用该函数。我希望你很快就会得到上下文绑定。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2023-03-25
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多