Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-在循环中最后一次超时后调用函数_Javascript_Function_Loops_Reactjs_Timeout - Fatal编程技术网

Javascript-在循环中最后一次超时后调用函数

Javascript-在循环中最后一次超时后调用函数,javascript,function,loops,reactjs,timeout,Javascript,Function,Loops,Reactjs,Timeout,我目前有一个循环,它每秒为HTML元素设置动画,在最后一个动画完成后,我希望接受用户输入: playSequence(currentLevel) { console.log("playing level " + currentLevel) for (var q = 0; q < currentLevel; q++) { (function(q) { setTimeout(function() { var active = '#' + sequen

我目前有一个循环,它每秒为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));
 }    
}
playSequence(当前级别){
console.log(“播放级别”+当前级别)
对于(var q=0;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   
}
playSequence(当前级别){
console.log(“播放级别”+当前级别)
对于(var q=0;q
然后getInput确实会运行,但是它不能像我希望的那样工作,因为它在动画完成之前运行,因为它在超时范围之外运行


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

@PHPGlue的注释有效,如果将来有人偶然发现,请留下答案:

如果你做了var t=这个;在所有匿名函数中,都可以使用t.getInput()


这是一个上下文问题,在第一个示例中,
这个
指的是
活动的
元素,在第二个示例中,它指的是
播放序列
函数的上下文。它包含在React类中,getInput不是播放序列中的方法,它们都在一个名为“Game”的类中如果您这样做
var t=this
在所有匿名函数中,您可以在其中使用
t.getInput()
。@PHPglue谢谢,这很有效!在意识到这是jQuery之后,我从注释中删除了“这是匿名函数中的窗口”,以便在其他上下文中调用该函数。我希望你很快就会得到上下文绑定。