1
resposta

Desafio Quiz

Ola, segue meu desafio. Tenho uma duvida sobre como poderia colocar para retornar ate dar uma resposta valida se caso a pessoa digitasse outra letra que não fosse a,b ou c, eu tentei e em parte consegui colocando o if determinando que letras diferentes dessas, apareceria uma mensagem de resposta invalida, mas dai pra retornar a questão e solicitar uma nova resposta que seja compativel eu não sei como fazer. Poderiam me ajudar??


const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
})

console.log('Bem vindo(a) ao quiz de JavaScript!');
console.log('Responda com a letra correta: a, b ou c\n');

let acertos = 0;

rl.question('1) Qual palavra usamos para criar uma função?\n(a) define\n(b) function\n(c) create\n> ', (resposta1) => {
    resposta1 = resposta1.toLowerCase()
//     if (resposta1 !== 'a' && resposta1 !== 'b' && resposta1 !== 'c') {
//     console.log('Selecione uma opção disponível!');
//     return
// }
    if (resposta1 == 'b') {
        acertos++
    }
    rl.question('2) QUal dessas é uma estrutura de repetição?\n(a) loopar\n(b) repeat\n(c) for\n> ', (resposta2) => {
        resposta2 = resposta2.toLowerCase()
        if (resposta2 == 'c') {
            acertos++
        }
        rl.question('3) Qual valor é considerado falsy em JAvaScript?\n(a) 1\n(b) 0\n(c) "texto"\n>  ', (resposta3) => {
            resposta3 = resposta3.toLowerCase()
            if (resposta3 == 'b') {
                acertos++
            }

            if (acertos == 3) {
                console.log('Parabéns você gabaritou!');
            } else if (acertos == 2) {
                console.log('Muito bom! Continue assim!');
            } else if (acertos == 1) {
                console.log('Bom! Continue estudando!');
            } else {
                console.log('Continue praticando e tente novamente!')
            }

            rl.close()


        })
    })
})
1 resposta

Olá, Stephanie. Como vai?

Parabéns pelo desafio! Criar um quiz interativo usando o módulo readline é uma excelente forma de praticar como o JavaScript lida com entradas de dados e fluxos assíncronos.

Sua dúvida é muito comum: "Como forçar o usuário a responder corretamente antes de seguir em frente?". No seu código atual, você está usando o que chamamos de "Callback Hell" (funções dentro de funções), o que torna difícil criar repetições.

A lógica da repetição

Para conseguir o efeito de "perguntar de novo", a melhor estratégia é isolar a pergunta em uma função separada que chama a si mesma (recursividade) caso a resposta seja inválida.

Como implementar:

Uma forma moderna e limpa de fazer isso é transformar o rl.question em uma função que usa Promises. Isso permite que você use um laço while (dentro de uma função async) para "prender" o usuário na pergunta até que ele digite algo válido.

Veja este exemplo simplificado para a sua primeira pergunta:

const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

// Transformamos o question em algo que podemos "esperar" (await)
const fazerPergunta = (query) => new Promise((resolve) => rl.question(query, resolve));

async function rodarQuiz() {
    let acertos = 0;

    // Pergunta 1 com validação
    let resposta1 = "";
    while (true) {
        resposta1 = (await fazerPergunta('1) Qual palavra usamos para criar uma função?\n(a) define\n(b) function\n(c) create\n> ')).toLowerCase();
        
        if (['a', 'b', 'c'].includes(resposta1)) {
            break; // Resposta válida, sai do loop
        }
        console.log('Opção inválida! Por favor, escolha a, b ou c.\n');
    }

    if (resposta1 === 'b') acertos++;
    
    // ... repetir o padrão para as outras perguntas ...

    console.log(`Fim do quiz! Você acertou ${acertos} questões.`);
    rl.close();
}

rodarQuiz();

Por que isso funciona?

  1. while (true): Cria um loop infinito proposital.
  2. await: Faz o código parar e esperar o usuário digitar, sem precisar "aninhar" uma função dentro da outra.
  3. break: É a nossa "chave de saída". O código só passa para a próxima linha se a resposta estiver dentro do array ['a', 'b', 'c'].

Dica de Ouro:

O uso do includes() é muito mais elegante do que fazer vários if (res !== 'a' && res !== 'b'...). Ele verifica se o que o usuário digitou faz parte da sua lista de opções permitidas.

Tente aplicar essa estrutura de while com async/await no seu código. Além de resolver o problema da validação, seu código vai ficar muito mais fácil de ler e dar manutenção!

Espero que possa ter lhe ajudado!