1
resposta

[Dúvida] Dúvida - Gostaria de Implementar Solicitando nomes até digitar ''fim'' Com readline

Estou com problemas, devido o question ser assíncrono, gostaria de ver outras soluções talvez nesse mesmo raciocinio, sem ter muitas modificações.

Código não funcional.

/* Você está criando um sistema de cadastro em que a pessoa 
usuária pode cadastrar quantos nomes quiser, um por vez. 
O processo deve continuar até que seja encontrado a palavra "fim" 
(com letras minúsculas).

Crie um programa que com base em uma entrada pré-definida de nomes, 
exiba cada um deles, e encerre somente quando encontrar o valor "fim".

Exemplo de entrada:
const entradas = ["Ana", "Bruno", "Carla", "fim", "Daniel"];

Saída esperada:
Nome: Ana
Nome: Bruno
Nome: Carla */

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

let fim = false
const nomes = []

while(!fim){

    leitor.question('Digite um nome \n>', (nome) => {

        if(nome !== 'fim'){
            nomes.push(nome)
        }else{
            fim = true;
        }

        leitor.close()
    })
}

for(let i = 0; i < nomes.length; i++){
    console.log('Nome: ', nomes[i])
}
1 resposta

Oi Caio, tudo bem? 😊

Entendi a sua dúvida!
O problema do seu código é que o readline.question é assíncrono e o loop while não espera a resposta do readline.question para continuar. 🤔

Uma solução é usar uma função recursiva para solicitar os nomes até que a palavra "fim" seja digitada.
Veja este exemplo:

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

const nomes = [];

function perguntarNome() {
    readline.question('Digite um nome (ou "fim" para encerrar): ', nome => {
        if (nome.toLowerCase() === 'fim') {
            readline.close();
            imprimirNomes();
        } else {
            nomes.push(nome);
            perguntarNome();
        }
    });
}

function imprimirNomes() {
    console.log('\nNomes cadastrados:');
    nomes.forEach(nome => console.log(nome));
}

perguntarNome();

Nesse código, a função perguntarNome() é chamada recursivamente até que o usuário digite "fim".
Quando isso acontece, a função imprimirNomes() é chamada para exibir os nomes cadastrados.

🎓 Para saber mais:

Espero ter ajudado! 💪