1
resposta

Requisição da API, qual melhor método?

Prazer colegas, estou fazendo o curso "JavaScript: criando requisições" e para a exibição de vídeos do yotube na tela foi feito um código dessa maneira:

`
import { conectaApi } from "./api.js";

const elementoUL = document.querySelector("[data-lista]");

function constroiCard(titulo, descricao, url, imagem) {
const video = document.createElement('li');
video.className = "videos__item";
video.innerHTML = `
    <iframe width="100%" height="72%" src="${url}"
        title="${titulo}" frameborder="0"
        allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
        allowfullscreen>
    </iframe>
    <div class="descricao-video">
        <img src="${imagem}" alt="logo canal alura">
        <h3>${titulo}</h3>
        <p>${descricao}</p>
    </div>
`

return video;
}

async function listaDeVideos() {
    const listaApi = await conectaApi.getVideosAPI();
    listaApi.forEach( (elemento) => elementoUL.appendChild(
        constroiCard(elemento.titulo, elemento.descricao, elemento.url, elemento.imagem)))
}

listaDeVideos();
`

, onde o import do arquivo com o conectaApi tem uma função assíncrona que faz o get da API e o const "elementoUL" é feito em cima de um data attribute de uma lista "ul" onde serão inseridos alguns itens "li".

Apesar de entender a metodologia utilizada, em um outro curso foi utilizada uma maneira diferente de exibição da API na tela e achei que seria interessante aplicar meu conhecimento e tentar fazer de uma forma diferente, então acabei fazendo assim também:

import { conectaApi } from "./api.js";

const elementoUL = document.querySelector("[data-lista]");

function constroiCard(listaDeVideos) {

    listaDeVideos.forEach( (video) => {
        elementoUL.innerHTML += `
            <li class="videos__item">
                <iframe width="100%" height="72%" src="${video.url}"
                    title="YouTube video player" frameborder="0"
                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
                    allowfullscreen></iframe>
                <div class="descricao-video">
                    <img src="${video.imagem}" alt="logo canal alura">
                    <h3>${video.titulo}</h3>
                    <p>${video.descricao}</p>
                </div>
            </li>
        ` 
    })
}

async function listaDeVideos() {
    const lista = await conectaApi.getVideosAPI();
    constroiCard(lista)
}

listaDeVideos();

Não tive dúvidas na implementação, os dois códigos funcionaram, mas o que eu realmente gostaria de saber é se algum dos métodos é mais eficiente e tem um desempenho melhor? Algum deles é o mais correto a se utilizar? Porque?

Testando aqui, as vezes o primeiro código carrega a página mais rápido do que o segundo... tem algum motivo?

Outro ponto é que estou recebendo o seguinte erro no console independente de qual código eu utilizo: Insira aqui a descrição dessa imagem para ajudar na acessibilidade, como posso arrumar isso?

1 resposta

Olá Marcus, tudo bem?

Primeiramente, parabéns por estar estudando sobre requisições em JavaScript! É muito importante entender como elas funcionam e como podemos utilizá-las em nossos projetos.

Sobre a sua dúvida, ambos os métodos que você utilizou para exibir a API na tela estão corretos e funcionais. No entanto, o primeiro método é mais performático, pois utiliza a técnica de criação de elementos HTML de forma programática, o que é mais eficiente do que a técnica utilizada no segundo método, que é a manipulação direta do HTML com a propriedade innerHTML.

Quanto ao motivo pelo qual o primeiro código carrega a página mais rápido do que o segundo, isso pode estar relacionado à técnica utilizada, como mencionado anteriormente. Além disso, pode haver outros fatores envolvidos, como o tamanho dos dados retornados pela API e a velocidade da conexão com a internet.

Sobre o erro que você está recebendo no console, aparentemente é um erro de CORS (Cross-Origin Resource Sharing), que acontece quando uma página web tenta acessar recursos de outro domínio. Para resolver esse problema, é necessário configurar o servidor que está fornecendo a API para permitir o acesso a partir do seu domínio. Infelizmente, essa solução está fora do escopo deste fórum, mas você pode encontrar mais informações sobre como resolver esse erro na documentação do servidor que está fornecendo a API.

Espero ter ajudado e bons estudos!