2016-05-09 31 views
0

我的朋友用python創建了一個簡單的國家猜謎遊戲程序,並且從未與JavaScript中的用戶輸入混淆,我試圖在npm上使用prompt庫重新創建它。在JavaScript中創建一系列基於控制檯文本的輸入?

當我陷入其中時,最終發現了「諾言中的承諾」,並意識到我可能不知道自己在做什麼,我知道我需要去其他地方尋求幫助。

由於JavaScript的異步特性,我將如何創建一個命令行遊戲,它會根據每個國家/地區的y個提示猜測x個國家/地區的數量。例如,它選擇一個國家,並說第一個提示,如果該人不能在第一個提示中猜出國家,則顯示第二個提示,依此類推。

我的下面的代碼糟透了,幾乎沒什麼用,但我會給它只是爲了表明我嘗試過。

let createCountry = (name, hints) => { return { name, hints } } 

let countries = [ 
    createCountry("america", ["my home!"]), 
    createCountry("not america", ["not my home!"]) 
] 

for (let i = 0; i < countries.length; i++) { 
    new Promise(function(resolve, reject) { 

     let count = 0; 
     let country = countries[i] 
     console.log(country.name) 

     for (let h = 0, hint = country.hints[h]; h < country.hints.length; h++) { 

      let result = new Promise(function(resolve, reject) { 

       prompt.get(["country"], (err, result) => { 

        console.log(`Hint ${h + 1}/${country.hints.length}: ${hint}`) 

        if (result === country.name) { 
         console.log("You guessed correctly") 
         resolve(true) 
        } else { 
         console.log("You did not guess correctly") 
         reject(false) 
        } 
       }) 

      }) 

     } 

     console.log("\n") 

    }) 
} 
+0

JavaScript總是*同步*,我真的沒有看到這裏需要異步執行,因爲它應該是非常直接的實現沒有任何異步行爲。看看https://teamtreehouse.com/library/javascript-basics/making-decisions-with-conditional-statements/build-a-random-number-guessing-game –

回答

1

由於javascript的同步特性,控件轉到for循環中的下一個迭代,並且不會等待提示完成執行。

解決這個問題有很多種方法。 ES7中的異步/等待功能將使我們更接近反映同步流程的寫作風格。其他方法將需要你離開「for循環」迭代器。

要使用async/await,您可以使用像babel這樣的編譯器,也可以使用像asyncawait這樣的庫。我使用asyncawait庫改變了你的程序。

'use strict'; 

var prompt = require('prompt'); 
var async = require('asyncawait/async'); 
var await = require('asyncawait/await'); 

let countries = [ 
    createCountry("america", ["my home!","hint 2"]), 
    createCountry("not america", ["not my home!","hinnt 3"]) 
] 

prompt.start(); 

var asyncCountry = async(function guessCountry(countries) { 

    for (let i = 0; i < countries.length; i++) { 

     let count = 0; 
     let country = countries[i] 
     console.log('name:' + country.name); 

     for (let h = 0, hint = country.hints[h]; h < country.hints.length; h++) { 
      let result = await (checkCountry(country.name));    
     } 

     console.log("\n"); 

    } 

}); 

function checkCountry(name) { 

    return new Promise(function(resolve, reject) { 

     prompt.get(["country"], (err, result) => { 

      //console.log(`Hint ${h + 1}/${country.hints.length}: ${hint}`) 

      if (result === name) { 
       console.log("You guessed correctly");     
      } else { 
       console.log("You did not guess correctly"); 
      } 

      resolve(true); 
     }) 

    }) 
} 

asyncCountry(countries); 
+0

「由於JavaScript的異步性質」應該可能是* synchronous *。 –

相關問題