2016-09-07 98 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); 
       }