2017-12-06 3 views
0
var fs = require("fs"); 
var inquirer = require("inquirer"); 
var words = ["ALPHA","BRAVO","CHARLIE","DELTA","ECHO","FOXTROT","GOLF","HOTEL","INDIA","JULIET","KILO","LIMA","MIKE","NOVEMBER","OSCAR","PAPA","QUEBEC","ROMEO","SIERRA","TANGO","UNIFORM","VICTOR","WHISKEY","XRAY","YANKEE","ZULU"]; 

function nodeMan() { 
    var wrongs = 0; 
    var lettersGuessed = []; 
    var word = words[Math.floor(Math.random()*words.length)]; 
    var goldenBoy = word.split(""); 
    var blank = "_" * word.length; 

    console.log(blank); 

    for (var i = 0; wrongs < 10; i++) { 
    var neem = "Question " + i; 
    inquirer.prompt([{name: neem, message: "Guess a letter"}]).then(function(response) { 
     console.log("print"); 
     lettersGuessed.push(resposne.name); 
     if (response.name.length < 1 && lettersGuessed.indexOf(response.name)) { 
     console.log(" first if statement cleared"); 
     for (var u = 0; u < goldenBoy.length; u++) { 
      if (goldenBoy[u] === response.name) { 
      blank[u] = response.name; 
      console.log(blank); 
      } 
     } 
     } 
    }) 
    } 
} 
nodeMan(); 

Der Versuch, diese asynchron auszuführen. Ab rn bekomme ich eine Endlosschleife von "Guess a letter". Brauchen Sie Hilfe, den Fragesteller zu bekommen, um eine Frage zu einer Zeit statt unendlich zu schießen. Vielen Dank für Ihre Zeit!So führen Sie die asynchrone Schleife für die Abfrage aus:

einen Testordner nicht vergessen npm init einzurichten und inquirer

+0

Nicht mit einer Schleife passieren. Sie müssen Ihre eigene Schleife erstellen, indem Sie die Funktion für die nächste Iteration aufrufen. – epascarello

+0

Ihr Code ist schrecklich. Schauen Sie sich einfach die Pyramide der Tabs an. Immer wenn Sie eine Einrückung von mehr als ~ 3 Ebenen sehen, ist es automatisch schlechter Code und Sie sollten überlegen, ihn neu zu schreiben. –

+0

@epascarello kannst du, wenn du 'async/await' verwendest – charlietfl

Antwort

0

Sie keine for Schleife verwenden können, und brauchen eine Rekursion zu verwenden: in der Antwort auf Ihre Frage, müssen Sie, wenn entscheiden, Sie werden eine andere Frage stellen und die gleiche Frage erneut auslösen (aus Ihrem Rückruf).

Hier ist eine grundlegende Code-Struktur, um Sie gehen:

function nodeMan() 
    const wrong = 0; // Store the number of wrong answers 
    const askQuestion =() => { 
    inquirer.prompt([{name: neem, message: "Guess a letter"}]).then((response) => { 
     // Here check the answer and decide if you want to ask another question 
     // [...] 
     wrong++; 
     // As long as less than 10 wrong answers, ask the question again 
     if (wrong < 10) { 
     // Ask the next question 
     askQuestion(); // Recursion ! 
     } 
    } 
    };                              
} 
nodeMan(); 
+0

Sie können a verwenden for-Schleife, wenn 'async/await' verwendet wird – charlietfl

+1

Korrekt, versuche es jetzt einfach zu halten. OP hat nicht einmal Pfeilfunktionen benutzt – klugjo

+1

Einfach den Kommentar erklären * "kann keine for-Schleife verwenden" * was vor nicht allzu langer Zeit wahr gewesen wäre, aber nicht mehr ganz genau ist. Vereinbaren Sie, dass wahrscheinlich rekursive Ansatz dafür sowieso besser ist – charlietfl

0

Wenn Sie Ihren Code unter NodeJS 7.0+, laufen Sie gehen eine Funktion als "async" Funktion deklarieren und "await" operator dann verwenden gewartet asynchrone Antwort in for-Schleife.

var fs = require("fs"); 
var inquirer = require("inquirer"); 
var words = ["ALPHA", "BRAVO", "CHARLIE", "DELTA", "ECHO", "FOXTROT", "GOLF", "HOTEL", "INDIA", "JULIET", "KILO", "LIMA", "MIKE", "NOVEMBER", "OSCAR", "PAPA", "QUEBEC", "ROMEO", "SIERRA", "TANGO", "UNIFORM", "VICTOR", "WHISKEY", "XRAY", "YANKEE", "ZULU"]; 

// declare an async function 
async function nodeMan() { 
    var wrongs = 0; 
    var lettersGuessed = []; 
    var word = words[Math.floor(Math.random() * words.length)]; 
    var goldenBoy = word.split(""); 
    var blank = "_" + word.length; 

    console.log(blank); 

    for (var i = 0; wrongs < 10; i++) { 
     var neem = "Question " + i; 
     // wait for asynchronous response 
     var response = await inquirer.prompt([{ 
      name: neem, 
      message: "Guess a letter" 
     }]); 
     console.log(response) 
     console.log("print"); 
     lettersGuessed.push(response.name); 
     if (response.name.length < 1 && lettersGuessed.indexOf(response.name)) { 
      console.log(" first if statement cleared"); 
      for (var u = 0; u < goldenBoy.length; u++) { 
       if (goldenBoy[u] === response.name) { 
        blank[u] = response.name; 
        console.log(blank); 
       } 
      } 
     } 
    } 
} 
nodeMan(); 
Verwandte Themen