Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

96
Vistas
Recuperar currentTime del elemento <audio> para cada evento 'timeupdate' bloquea el navegador

Estoy tratando de actualizar una variable de estado con el valor del atributo currentTime de un elemento. Agrego un detector de eventos al evento 'timeupdate' para poder llamar a setPosition con el valor de currentTime (la posición se usa para colocar la perilla en un control deslizante que representa la reproducción de la canción).

Sin embargo, recuperar audioElement.currentTime y usar el resultado como argumento para setPosition hace que mi navegador (tanto Chrome como Safari) se bloquee. De hecho, el Monitor de actividad en mi MacBook muestra que la cantidad de subprocesos que utiliza el sitio web local aumenta continuamente a medida que se reproduce el archivo de audio, pero no estoy seguro de lo que eso significa. El sitio también usa una cantidad significativa de memoria, pero SÓLO al recuperar el atributo de hora actual para cada evento de 'actualización de hora'.

No tengo idea de qué está causando problemas de rendimiento en mi componente, al menos supongo que es un problema de rendimiento.

El archivo de audio reproducido es .wav

 function SongPlayer({ file }) { const [audioElement] = useState(new Audio(file)); const [playing, setPlay] = useState(null); const [audioContext] = useState(new AudioContext({ sampleRate: 44100 })); const [gainNode] = useState(audioContext.createGain()); const [position, setPosition] = useState(0); useEffect( () => { const track = audioContext.createMediaElementSource(audioElement); track.connect(gainNode).connect(audioContext.destination); audioElement.addEventListener('timeupdate', () => { setPosition(audioElement.currentTime); }); }, [], ); useEffect( () => { if (playing) audioElement.play(); else if (!playing) audioElement.pause(); }, [playing], ); return ( <> </> ); } export default SongPlayer;

localhost usando +500 subprocesos y más de 1 Gb de memoria

EDITAR:

el problema fue cuando estaba llamando al new AudioContext() como un valor de estado inicial. El constructor estaba siendo llamado con cada renderizado .

Esta publicación me ayudó a resolverlo y lo explica bien: https://stackoverflow.com/a/64131447/13757284

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Le recomendaría que use la devolución de llamada de limpieza de useEffect para eliminar eventListener.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda