【问题标题】:setTimeout is not firing inside for loopsetTimeout 没有在 for 循环中触发
【发布时间】:2013-12-19 11:44:23
【问题描述】:

我有以下带有 setTimeout 函数的 jquery 代码将变量设置为 false,但它永远不会起作用,并且变量始终保持为 true

      for( var ff = 0; ; ff++)
      {
        if( dif == 0){
          break;
        }
        if (locked){
          // locked = false;
          setTimeout( function(){ locked = false; },2000);
        }
        else{
          LeftKeyPressed();
          locked = true ;
          setTimeout( function(){ locked = false; },3000);
          dif--;
        }
      }

任何人都可以帮助在将锁定变量设置为 true 两秒钟后将其设置为 false。

这是fiddle of this issue

【问题讨论】:

  • 提供一个 jsfiddle 来复制您的问题。什么是差异?你怎么称呼这个sn-p?顺便说一句,这个语法是错误的:dfd.done(LeftKeyPressed()); 应该是:dfd.done(LeftKeyPressed); 或者它可能是对的,但是你不知道这个函数的代码
  • 使用无限循环来响应变量值的变化通常是个坏主意。至少有一个每隔 50 毫秒左右检查一次值的间隔,或者如果您在需要的地方显示更大的上下文,我很确定有更好的方法来实现实际目标。
  • 不要在 javascript 中执行像 "for(var ff = 0; ; ff++)" 这样的无限循环,这会使您的网站无响应,可能会阻塞事件循环,并且那些 setTimeouts 不会运行,因为他们没有得到更改因为您的循环会占用所有可用时间。
  • @MohamedNaguib javascript 是一种单线程语言,这不是用 js 和我知道的任何其他语言编写代码的方式
  • @MohamedNaguib 但你没有解释你在找什么,为什么你想要这种行为?你只需要告诉你想要代码做什么。为什么要重复循环 3 次?

标签: javascript settimeout


【解决方案1】:

好吧,既然要求就是这样,我不知道你到底想要什么,但这是我能做到的最接近的:http://jsfiddle.net/db6gJ/

它调用方法 3 次,并在锁定为 false 或 true 时为您提供更改以执行您想做的事情。此外,它不会阻塞事件循环(使用无限循环),因此您的站点可以在 timeOut 调用运行时执行其他任务。

javascript代码也在这里:

var locked = true,
    timesMax = 3,
    timeCurrent = 0;

var inputLoop = function() {

    var delay = 2000;

    if(locked) {

        // Do something when locked is true
        console.log("locked is true!");

        locked = false;

    } else {

        // Do something when locked is false
        console.log("locked is false!");

        locked = true;
        delay = 3000;

    }

    timeCurrent++;

    // call again after delay, but call only 3 times
    if(timeCurrent < timesMax) {
        setTimeout(inputLoop, delay);
    }

};

// Launch it
inputLoop();

如果您查看您的 javascript 控制台(在 chrome 中:鼠标右键单击 -> 检查元素 -> 控制台),它应该会打印:

locked is true!
locked is false! 
locked is true! 

还要注意:您的原始代码在完成后有alert('out');,但老实说,代码将在其他地方继续执行,而您的“inputLoop”代码除了等待回调之外没有做任何其他事情运行,这是它应该的方式。

如果您不知道上次调用它的时间,您可以将前面几行修改为:

// call again after delay, but call only 3 times
if(timeCurrent < timesMax) {
    setTimeout(inputLoop, delay);
} else { 
    // Last call in this method
    console.log('done!');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多