Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Pacientes repetidos

Boa Noite!

Terminei o curso, gostei muito. Pude perceber que vc pode adicionar quantas vezes quiser os pacientes do ajax, como poderia impedir que isso acontecesse?

var botaoBuscar = document.querySelector("#buscar-pacientes");

botaoBuscar.addEventListener("click", function(){
    console.log("buscando pacientes...");

    var xhr = new XMLHttpRequest(); //O XMLHttpRequest diz que queremos abrir uma requisição http;

    xhr.open("GET", "https://api-pacientes.herokuapp.com/pacientes"); //abre a conexão com o servidor que deseja importar os arquivos;
    xhr.send(); // O open abre a conexão, porém, não a envia, por isso é necessário usar a função send();

    xhr.addEventListener("load", function(){ //É adicionado um escutador de eventos para receber o "load", que é a resposta do servidor.
        var errosAjax = document.querySelector("#erros-ajax");

        if(xhr.status == 200){
            errosAjax.classList.add("invisivel");
            var resposta = xhr.responseText;
            var pacientes = JSON.parse(resposta);

            pacientes.forEach(function(paciente){
                adicionaPacienteNaTabela(paciente);
            });
        }else{
            errosAjax.classList.remove("invisivel");
        }
    });
});

function pacientesAdiconados(){
    var pacientes = document.querySelectorAll(".pacientes");

    var pacientesBuscados = [];

    pacientes.forEach(function(paciente){
        pacientesBuscados.push(paciente);
    })
    return pacientesBuscados;
}

console.log(pacientesAdiconados());

eu pensei em criar essa função pacientesAdicionados(), que conteria todos os pacientes que possuem a classe .paciente, já que em todos os pacientes que são incrementados a tabela esta classe é adicionada, após isso comparar se o xhr.responseText é diferente do pacientesAdicionados, para aí sim adicionar os itens do ajax na tabela.

Porém dando um console.log o array já volta vazio, o que fiz de errado? Deveria usar outra Lógica?

6 respostas

Boa noite, Vinicius! Como vai?

No dia a dia vc não precisaria se preocupar com esse tipo de coisa pois a API teria alguma lógica de paginação de dados de modo que vc poderia acessar informações diferentes. Tudo que vc precisaria fazer é uma requisição para a página de dados que vc gostaria de receber.

Da maneira que está, sempre obtendo a mesma lista de negociações, vc teria que implementar algo seguindo a lógica que vc mesmo disse. Mas, novamente, não seria algo tão necessário no dia a dia.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Estou bem, obrigado.

Entendi, ficou bem claro. Porém, para estudar mesmo, gostaria de tentar implementar essa minha lógica, Mas ao executar a função ela retorna um array vazio, não compreendo pq. Poderia me ajudar?

solução!

Olá Vinícius, tudo bem com você?

Como o Gabriel disse, no cotidiano não temos muito esse problema de pegar dados repetidos, apenas nesses casos específicos onde estamos sempre trazendo a mesma informação que temos esse problema, mas vou te dar algumas dicas, ok?

  • Bloquear o Botão de Buscar

Bem, essa é a maneira mais fácil, porém pode trazer alguns problemas, mas poderíamos após fazer a requisição para trazer as informações desabilitar o botão, da seguinte maneira:

    var botaoAdicionar = document.querySelector('#buscar-pacientes');

Pegaríamos o botão com o seletor e quando a nossa requisição tivesse status == 200 desabilitaríamos

        if (xhr.status == 200) {
            // Resto do Código
                botaoAdicionar.disabled = true;
}

O problema é que para pegar dados atualizados ( caso um novo paciente fosse adicionado em nosso servidor) teríamos que atualizar a página

  • Comparar Os Pacientes

Essa ideia seria mais ou menos o que você pensou, a única questão é que precisaríamos ter algo único para cada paciente ( um identificador por exemplo) que não temos, então eu vou fingir que no nosso caso o nome é único

A partir disso poderíamos pegar todos os nomes da nossa tabela da seguinte maneira:

    var pacientesTabela = document.querySelectorAll('.info-nome');
    var pacientesAtuais = separarNome(pacientesTabela);

Acontece que esse pacientesTabela é um array com vários <td>, então eu criei uma função chamada separarNome para pegar todos os pacientes e me retornar um array apenas com os nomes dos pacientes ( que seria o texto que está dentro do <td>)

function separarNome(pacientesTabela){
    const pacientes = [];
    pacientesTabela.forEach(function(paciente){
        pacientes.push(paciente.textContent);
    })
    return pacientes;
}

Agora temos todos os pacientes que já estão em nossa tabela, e o que eu vou fazer é comparar com os pacientes que a nossa requisição trouxe, da seguinte maneira:

function pacientesNaoExistentes(pacientesAtuais, novosPacientes){
    var resultado = [];
}

Vou criar um array de resultados que vai conter apenas os dados não repetidos, e vamos receber 2 listas, agora o que eu tenho que fazer é comparar:

function pacientesNaoExistentes(pacientesAtuais, novosPacientes){
    var resultado = [];
    novosPacientes.forEach(function(paciente){

Então cada paciente que eu recebi eu vou checar se ele existe da seguinte maneira:

pacientesAtuais.includes(paciente.nome)

Todo array tem o método includes que comparar se um elemento está presente nele ou não, retornando true ou false

Então vou pegar todos elementos que não estão presentes:

function pacientesNaoExistentes(pacientesAtuais, novosPacientes){
    var resultado = [];
    novosPacientes.forEach(function(paciente){
        if(!pacientesAtuais.includes(paciente.nome)){
            resultado.push(paciente);
        }
    })
    return resultado;
}

Veja que eu coloquei um ! para negar o resultado, então poderíamos ler essa verificação da seguinte maneira: "Se a lista de pacientes atuais não inclui o paciente" a gente inclui no array de resultados

Esse método nos devolve apenas os pacientes que não estão na lista então agora basta a gente adicionar eles:

        if (xhr.status == 200) {
            erroAjax.classList.add("invisivel");
            var resposta = xhr.responseText;
            var pacientes = JSON.parse(resposta);
            var pacientesNaoRepetidos = pacientesNaoExistentes(pacientesAtuais, pacientes);
            pacientesNaoRepetidos.forEach(function(paciente) {
                adicionaPacienteNaTabela(paciente);
            });
            botaoAdicionar.disabled = true;
        } else {
            erroAjax.classList.remove("invisivel");
        }
    });

Compreendeu? Fique tranquilo caso tenha achado um pouco difícil, no dia a dia a gente não precisa fazer todo esse processo :)

E com os cursos de javascript avançado você vai ver que todo esse conhecimento vai sendo explicado!

Em relação a sua dúvida:

Mas ao executar a função ela retorna um array vazio, não compreendo pq. Poderia me ajudar?

Você cometeu um pequeno erro de digitação, temos que procurar pela classe .paciente, você digitou .pacientes dessa forma retorna um array vazio pois não há elementos com essa classe :)

Abraços e Bons Estudos!

Geovani, a variável novosPacientes seria o xhr.responseText?

Então Vinicius,

Veja que o novosPaciente é o segundo argumento da função que eu chamo aqui:

var pacientesNaoRepetidos = pacientesNaoExistentes(pacientesAtuais, pacientes);

Então o novosPacientes se refere ao JSON.parse(xhr.responseText), mas no nosso caso isso equivale a variável pacientes em nosso exemplo :)

Abraços!

Gabriel, Geovani, Muito obrigado pela ajuda!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software