Olá! Fiz o desafio do quiz, exigindo um pouco mais para tentar aprender sobre assincronismo, uso de promises, etc. Basicamente, queria validar que somente uma opção válida foi digitada, e se houve erro, chama-se a pergunta novamente, até o usuário digitar uma opção válida(a, b, ou c).
Em termos de clean code e boas práticas, o que o meu código a seguir tem para melhorar?
const readline = require('readline')
const leitor = readline.createInterface({
input: process.stdin,
output: process.stdout
})
console.log('Boas vindas ao Quiz de JavaScript!')
console.log('Responda com a letra correta: a, b ou c\n');
(async () => {
let acertos = 0
const pergunta1 = await perguntar('1) Qual palavra usamos para criar uma função?\n(a) define\n(b) function\n(c) create\n> ', 'b')
if (pergunta1) acertos++
const pergunta2 = await perguntar('2) Qual dessas é uma estrutura de repetição?\n(a) loopar\n(b) repeat\n(c) for\n> ', 'c')
if (pergunta2) acertos++
const pergunta3 = await perguntar('3) Qual valor é considerado falsy em JavaScript?\n(a) 1\n(b) 0\n(c) "texto"\n> ', 'b')
if (pergunta3) 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!')
}
leitor.close()
})()
function perguntar(pergunta, gabarito) {
return new Promise((resolve) => {
function iterarPergunta() {
leitor.question(pergunta, (resposta) => {
const opcao = resposta.trim().toLowerCase();
if (!["a", "b", "c"].includes(opcao)) {
console.log('Opção inválida. Digite apenas a, b ou c.\n')
iterarPergunta()
} else {
resolve(opcao === gabarito)
}
})
}
iterarPergunta();
})
}
Além disso, tive um pouco de dificuldade com o uso de IIFE, por não usar ponto e vírgula no console.log antes dele. É recomendado sempre colocar ponto e vírgula em tudo?
Sobre a declaração de função dentro do callback de uma promise, recebi essa dica do GPT, tem alguma outra forma de fazer? Busco saber o que seria mais profissional, em padrão de projeto