2016-09-07 54 views
0

我希望我的程序成功完成的任务是从命令提示符变量ask中获取一个值并检查它是否正确。但是如果玩家没有及时回答,设定的超时功能会执行,因此会减去寿命。为什么没有设置超时功能激活win语句?

我的问题是当我输入提示ask超时功能根本没有设置。

另外,我把所有东西都放在for循环中,所以当玩家确实得到正确答案时,它会再次运行并减去时间,因此解决问题的时间越来越少。我的代码如下。

var win = null; 
var product = "123456"; 
time = 3000; 

for(var i = 0; i < 1; i++) { 
    confirm("Round will start after you close this confirm window."); 

    setTimeout(function() { 
     var ask = prompt("Enter code below: (QUICK) " + product + " (Answer for development purposes)"); 

     if(ask === product){ 
      win = true; 
      console.log("Hurrah!"); 
     } else { 
      win = false; 
      console.log("Arr. Well get em next time."); 
     } 
    }, 1); 

    //Why is this not activating??? 
    setTimeout(function() { 
     if (win === null || false) { 
      lives = lives - 1; 
      win = false; 

      console.log("Oh No! You ran out of time. Lives left: " + lives); 
     } 
    }, time); 

    time = time - 100;  
} 
+0

什么是“生命”?另外,'win === null ||假'应该是'win === null || win === false'或者它永远不会执行 – Li357

+1

'prompt()'不支持超时,并且因为它是一个阻塞函数,所以在完成之前没有别的东西可以运行。 – jfriend00

+0

你想为此只有一个JavaScript的解决方案。无论@ jfriend00评论过的是你的问题的原因。而jQuery可以轻松解决你的问题。 – Manish

回答

2

prompt()是一个阻塞函数不返回,直到用户提供了所需的输入。因为它是阻塞的,所以在等待用户输入时没有其他Javascript运行。因此,setTimeout()无法运行,而prompt()正在等待输入。

所以,因为它是阻塞的,它没有内置的超时功能,所以你不能使用prompt()来做你想做的事情。它根本没有这种功能,并且该功能的阻塞特性阻止您使用setTimeout()来使超时功能正常工作。

假设这是在网页中,您可以使用不同形式的非阻塞提示(例如网页上的表单元素)。在这种情况下,您可以同时呈现要求用户输入的输入元素,并使用在未提供任何输入时会触发的setTimeout()。因为这种情况下的用户界面是非阻塞的,所以当这个用户界面呈现给用户时,其他Javascript可以运行,并且可以用这种方式实现超时。您还必须更改代码以处理事件处理程序,而不是阻止prompt()函数。

+0

@ Bubblegumz - 这是否回答你的问题? – jfriend00

+0

是的。非常感谢你。 – Bubblegumz

1

看来你的第二个超时中的if语句永远不会被执行。你可以试试这个

if(win == null || win == false){ 

        lives = lives - 1; 
        win = false; 

        console.log("Oh No! You ran out of time. Lives left: " + lives); 
       } 
相关问题