Error: carga duplicada de datos
Clase 10 de 17 • Curso de API REST con Javascript: Ejemplos con APIs reales
Contenido del curso
Clase 10 de 17 • Curso de API REST con Javascript: Ejemplos con APIs reales
Contenido del curso
Carlos Rodríguez
Daniel Flores
Carlos Rodríguez
JOSE RANGEL
Matias Diaz
César Augusto Cortés Labrada
Jose Castillo
Santiago Velásquez Serna
Bryan Castano
John Jairo Vera Pérez
Xavier Medina Veintimilla
Jonnier Martinez
Edgardo Andres Vargas Saenz
Manuel Araujo
Jean Bustamante
Ricardo Alfonso Chavez Vilcapoma
Gabriel Fernandez
Vanessa Cardenas
Juan Castro
Xavier Flores
Jose Luis Bedoya
Gianluca Enzo Procopio
Esta es mi estructura de carpetas y código: . Mi repositorio . Commit Actual
😃 Que ordenado se mira. En mi caso aún no acostumbro documentar de esa manera los proyectos de los cursos, quisiera pero no se ni por donde empezar o que debería escribir. ¿Algún consejo?
Aunque esta solución evita el problema del duplicado, es un poco no muy óptimo porque cada vez que vuelves al home estás haciendo la petición a la api. Si es una app con miles de usuarios al mismo tiempo conectados, debemos tener un super back que pueda soportar toda esta cantidad de peticiones al mismo tiempo. . Una manera también muy sencilla es que el llamado a la api solo se haga una sola vez. ¿Cómo podemos implementar esto? Hay varias maneras de hacerlo. Una muy sencilla, sería, por ejemplo, preguntando si en nuestra section de categorías contamos con 'hijos' nodos. Si no contamos con hijos nodos quiere decir que es la primera carga y por ende se debe ejecutar la llamada a la api, de lo contrario, sí ya hay hijos nodos no es necesario hacer la petición. .
const childrenCategoriesPreview = Array.from(categoriesPreviewList.children); if(!childrenCategoriesPreview.length){ getTrendingMoviesPreview(); getCategoriesMoviesPreview(); }
. Agregando este condicional evito el constante llamado a la api.
Excelente Jose! Podrías mostrarnos como te quedo el código implementando ese condicional?
Muy buena solución, evitas la consulta y la repetición de elementos. Al menos hasta que nos enseñen lo de la caché creo que haré uso de este aporte.
Un pequeño aporte, nada relevante pero quizás a alguien le interese jaja..
Si usaron el parametro de lenguaje de la API, para colocarlo en español
params: { 'api_key': API_KEY, 'language': 'es-VE', },
Yo soy de Venezuela, por eso coloque el "VE", si son de México por ejemplo seria "es-MX", de este modo la API arrojara los datos en el idioma deseado, y también hace diferencia en las imágenes de las películas, como saben en otros paises las imágenes de las carteleras de las películas suelen variar, al igual que varia la tendencia de las películas.
Otro detalle es que cuando se traduce en la parte de categorias, la categoría de "Suspense".. no se traduce bien y queda igual. Si quieren arreglar esto pueden solucionarlo de la siguiente manera:
const categoryTitleText = document.createTextNode(`${ category.name == 'Suspense' ? 'Suspenso' : category.name }`);
No se que tan buena practica sea, pero lo que hice desde el inicio fue utilizar los template literals para crear todo el html y de ahi hacer una unica inserción al Dom con el innerHtml
let moviesInHtml=`${movies.map(movie=>` <div class="movie-container"> <img src="https://image.tmdb.org/t/p/w300${movie.poster_path}" class="movie-img" alt="${movie.original_title}" /> </div> `).join("")}` trendingMoviesPreviewList.innerHTML=moviesInHtml
Yo he sabido que esto 'Literal Templates' NO es Bueno hacerlo en Producciion por razones de CyberSec y riesgos asociados Hacking a nuestros Sitios Web. Por tanto para Manipular el DOM es mejor hacerlo con las methodos desde JS como se ha hecho por aqui y en lso cursos pasados.
¿Es viable también si se mueven los llamados a las funciones getTrendingMoviesPreview y getCategoriesPreview al archivo main.js? Así cargaría la página home una sola vez al cargar el archivo main.js y no cada que se llama a la función homePage
¡Hola! 👋
Si cargaría más rápido, pero para nosotros como desarrolladores es iportante que el código esté limpio para otros desarrolladores. Para optimizar código como lo que dices tenemos el Curso de Webpack donde nos enseñan que con un comando lo optimiza para producción. Pásate por allí y cuéntanos que te pareció. :D
Nunca pares de aprender. 💚
Estas clases me encantan. Pero tengo una pregunta. ¿Cómo hago para que en producción me funcione la API key? , en mi caso estoy usando netlify. ¿Cuáles son las mejores prácticas para manejar estas variables privadas? Hay un curso en platzi sobre esto?
Hola Jonnier_Martinez, eso lo podrías solucionar con variables de entorno. Las variables de entorno son variables externas que residen en el sistema operativo o en el contenedor de la aplicación que se está ejecutando. Para eso necesitas saber un poco de Node.js (muy poco). En el curso de Webpack, hacen un deploy a producción usando variables de entorno.
En este video veo que el profesor respondió la segunda pregunta que hice en el video anterior: borrar las variables que estaban dentro de getTrendingMoviesPreview() y getCategoriresPreview() porque ya habían sido establecidas en el archivo node.js.
Yo lo había solucionado antes de ver esta clase, simplemente con una variable llamada isLoaded en el archivo navigation.js ¿Tiene desventajas mi solución?
Inicializo la variable como falsa y después la vuelvo true y de ahí ya no vuelve a cambiar y no actualiza ni duplica el contenido hasta que se recargue la página. fn mainpage()
function mainPage(){ console.log('Estás en la main page'); hideFromDom('movie-page'); //hideFromDom('trending-page'); //hideFromDom('search-page'); //hideFromDom('category-page'); showElementsOnDom('main-page'); if (!isLoaded) { getTrendingMoviesPreview('main-trending-movies'); getLatestMoviesPreview('main-latest-movies'); isLoaded = true; //evitar volver a cargar cuando se navega de vuelta. } }
Consejo si es que han copiado el proyecto desde un inicio del profesor:
Respira y no te rindas, es díficll acomodar la vista desktop pero si respiras por 5 segundos lo lograrás estilizar a tu manera.
Hola! Yo solucione eso sin darme cuenta del error. Solo puse el getTrendingMoviesPreview(); getCategoriesPreview(); al final del navigation.js cuando estaba ordenando el codigo sin darme cuenta que se repetian antes de cambiarlo. y fue en esta clase que me entere que se repetian si no lo hubiera puesto al final.
¿Ese error de carga no se puede solucionar con Redis? Tengo entendido que funciona como memoria caché y que podemos establecer vencimiento. Por ejemplo si busqué Batman, y luego vuelvo a buscarla, me aparece más rápido la respuesta pero si en 5 minutos (ejemplo del tiempo limitado) lo vuelvo a buscar cuando ya se venció el tiempo, accede a la base de datos de tmdb.
No sé muy bien si es buena idea.
Algo así Redis efectivamente funciona como una base de datos temporal mucho más rápida que una db con persistencia permanente (o al menos a largo plazo) Pero eso depende del back, no del front Si no puedes controlar el back, habría que usar alguna otra estrategia
estoy podríamos llamarla una SPA vanilla, ya que la navegacion de la pagina web se mantiene en el mismo URL
lo solucione así: categoriesPreviewList.innerHTML = '';
No se si está mal, pero antes de ver la clase solucioné el bug poniendo el innerHTML = "" en la funcion de homePage en navigation.js