Esta función a continuación no funciona como yo quiero; siendo un novato de JS, no puedo entender por qué.
Necesito que espere 5 segundos antes de verificar si newState es -1 .
Actualmente, no espera, simplemente verifica de inmediato.
function stateChange(newState) { setTimeout('', 5000); if(newState == -1) { alert('VIDEO HAS STOPPED'); } }Debe poner su código en la función de devolución de llamada que proporciona a setTimeout :
function stateChange(newState) { setTimeout(function () { if (newState == -1) { alert('VIDEO HAS STOPPED'); } }, 5000); }Cualquier otro código se ejecutará inmediatamente.
Aquí hay una solución que usa la nueva sintaxis async/await .
Asegúrese de comprobar la compatibilidad del navegador, ya que se trata de una función de lenguaje introducida con ECMAScript 6.
Función de utilidad:
const delay = ms => new Promise(res => setTimeout(res, ms));Uso:
const yourFunction = async () => { await delay(5000); console.log("Waited 5s"); await delay(5000); console.log("Waited an additional 5s"); };La ventaja de este enfoque es que hace que su código se vea y se comporte como código síncrono.
Node.js 16 proporciona una versión integrada de setTimeout que se basa en promesas para que no tengamos que crear nuestra propia función de utilidad:
import { setTimeout } from "timers/promises"; const yourFunction = async () => { await setTimeout(5000); console.log("Waited 5s"); await setTimeout(5000); console.log("Waited an additional 5s"); };Realmente no debería estar haciendo esto , el uso correcto del tiempo de espera es la herramienta adecuada para el problema del OP y cualquier otra ocasión en la que solo desee ejecutar algo después de un período de tiempo. Joseph Silber lo ha demostrado bien en su respuesta. Sin embargo, si en algún caso de no producción realmente desea colgar el hilo principal durante un período de tiempo, esto lo hará.
function wait(ms){ var start = new Date().getTime(); var end = start; while(end < start + ms) { end = new Date().getTime(); } }Con ejecución en la forma:
console.log('before'); wait(7000); //7 seconds in milliseconds console.log('after');Llegué aquí porque estaba creando un caso de prueba simple para secuenciar una combinación de operaciones asincrónicas en torno a operaciones de bloqueo de ejecución prolongada (es decir, manipulación DOM costosa) y esta es mi operación de bloqueo simulada. Se adapta bien a ese trabajo, así que pensé en publicarlo para cualquier otra persona que llegue aquí con un caso de uso similar. Aun así, está creando un objeto Date() en un bucle while, lo que podría abrumar al GC si se ejecuta el tiempo suficiente. Pero no puedo enfatizar lo suficiente, esto solo es adecuado para pruebas, para construir cualquier funcionalidad real, debe consultar la respuesta de Joseph Silber.