CursosEmpresasBlogLiveConfPrecios

Error: carga duplicada de datos

Clase 10 de 17 • Curso de API REST con Javascript: Ejemplos con APIs reales

Clase anteriorSiguiente clase

Contenido del curso

Presentación del proyecto: PlatziMovies
  • 1
    TheMovieDB: análisis de su API

    TheMovieDB: análisis de su API

    07:15
  • 2
    Bocetos en papel y diseño en Figma

    Bocetos en papel y diseño en Figma

    08:05
Configuración inicial y maquetación del proyecto
  • 3
    Configuración del entorno de desarrollo

    Configuración del entorno de desarrollo

    16:53
  • 4
    Maquetación del proyecto: HTML y CSS

    Maquetación del proyecto: HTML y CSS

    18:34
Consumiendo la API
  • 5
    Lista de películas en tendencia

    Lista de películas en tendencia

    16:41
  • 6
    Lista de categorías

    Lista de categorías

    10:32
  • 7
    Migración a Axios

    Migración a Axios

    07:18
Navegación
  • 8
    Location y hash navigation

    Location y hash navigation

    17:17
  • 9
    Mostrando y ocultando secciones

    Mostrando y ocultando secciones

    22:05
  • 10
    Error: carga duplicada de datos

    Error: carga duplicada de datos

    06:30
Views
  • 11
    Filtrando películas por categoría

    Filtrando películas por categoría

    21:38
  • 12
    Retos: scrollTop y DRY

    Retos: scrollTop y DRY

    11:13
  • 13
    Buscador de películas

    Buscador de películas

    11:10
  • 14
    Retos: historial de navegación y página de tendencias

    Retos: historial de navegación y página de tendencias

    06:19
  • 15
    Endpoint de detalles de una película

    Endpoint de detalles de una película

    18:55
  • 16
    Lista de películas recomendadas

    Lista de películas recomendadas

    07:36
Próximos pasos
  • 17
    Toma el Curso Profesional de Consumo de API REST con JavaScript

    Toma el Curso Profesional de Consumo de API REST con JavaScript

    02:19
    Carlos Rodríguez

    Carlos Rodríguez

    student•
    hace 4 años

    Esta es mi estructura de carpetas y código: . Mi repositorio . Commit Actual

      Daniel Flores

      Daniel Flores

      student•
      hace 4 años

      😃 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?

      Carlos Rodríguez

      Carlos Rodríguez

      student•
      hace 4 años
      1. Seguir la ruta de aprendizaje que propone Platzi de esta escuela de desarrollo Web, me ha ayudado muchísimo, cada profesor tienen sus tips sobre como organizar proyectos.
      2. La forma de organizar proyectos es muy subjetiva, no debe ser este orden, pero sí debe estar ordenado a tu criterio y experiencia en documentaciones sobre estructura de proyectos frontend. Existen muchas maneras de organizar un proyecto frontend y de tipo SPA.
      3. El uso de linters como eslint y formateadores como prettier es de gran ayuda para organizar tu código de manera estricta, al principio de quiebras la cabeza pero después te adaptas!
      4. La extensión Material Icons para VScode es muy util, si vez su documentación, verás los diferentes iconos adaptados a cada tipo de carpeta basado en las carpetas más comunes en estructura de proyectos, y de allí podrás ver que es lo que necesitas para tu proyecto.
      5. El uso de git es muy importante y más aun documentarse sobre convenciones en nombres de ramas y commits para tu proyecto tenga un orden muy bueno, en el archivo readme verás toda esa convención y las referencias que he usado.
    JOSE RANGEL

    JOSE RANGEL

    student•
    hace 3 años

    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.

      Matias Diaz

      Matias Diaz

      student•
      hace 3 años

      Excelente Jose! Podrías mostrarnos como te quedo el código implementando ese condicional?

      César Augusto Cortés Labrada

      César Augusto Cortés Labrada

      student•
      hace 3 años

      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.

    Jose Castillo

    Jose Castillo

    student•
    hace 3 años

    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 }`);
    Santiago Velásquez Serna

    Santiago Velásquez Serna

    student•
    hace 3 años

    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
      Bryan Castano

      Bryan Castano

      student•
      hace 9 meses

      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.

    John Jairo Vera Pérez

    John Jairo Vera Pérez

    student•
    hace 4 años

    ¿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

      Xavier Medina Veintimilla

      Xavier Medina Veintimilla

      student•
      hace 4 años

      ¡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. 💚

    Jonnier Martinez

    Jonnier Martinez

    student•
    hace 3 años

    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?

      Edgardo Andres Vargas Saenz

      Edgardo Andres Vargas Saenz

      student•
      hace 3 años

      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.

    Manuel Araujo

    Manuel Araujo

    student•
    hace 3 años

    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.

    Jean Bustamante

    Jean Bustamante

    student•
    hace 3 años

    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. } }
    Ricardo Alfonso Chavez Vilcapoma

    Ricardo Alfonso Chavez Vilcapoma

    student•
    hace 3 años

    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.

    Gabriel Fernandez

    Gabriel Fernandez

    student•
    hace 3 años

    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.

    Vanessa Cardenas

    Vanessa Cardenas

    student•
    hace 2 años

    ¿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.

      Juan Castro

      Juan Castro

      teacher•
      hace 2 años

      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

    Xavier Flores

    Xavier Flores

    student•
    hace 2 años

    estoy podríamos llamarla una SPA vanilla, ya que la navegacion de la pagina web se mantiene en el mismo URL

    Jose Luis Bedoya

    Jose Luis Bedoya

    student•
    hace 3 años

    lo solucione así: categoriesPreviewList.innerHTML = '';

    Gianluca Enzo Procopio

    Gianluca Enzo Procopio

    student•
    hace 3 años

    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

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads