Estoy tratando de entender cómo funcionan las funciones asíncronas en JavaScript y cómo escribirlas, pero me parece que la forma en que el lenguaje maneja las funciones asíncronas es bastante limitada, pero puedo estar equivocado y, probablemente, no lo entendí.
Uso Visual Studio Code (v. 1.66.2) y Chrome (v 100.0.4896.88) en Windows 10 X64.
Solo con fines experimentales, escribí una función heavyLoad() simple que obtiene un parámetro de retraso (que representa un valor de milisegundos) y devuelve true después de que transcurre el tiempo:
function heavyLoad(delay) { let startTime = (new Date()).getTime(); while(new Date().getTime() < startTime + delay); return true; }Si escribo:
heavyLoad(5000); console.log(“Hello”); la función console.log() se ejecuta, obviamente, después de 5 segundos, ya que tengo que esperar a que finalice la función heavyLoad() .
Estoy tratando de hacer que la función heavyLoad() sea asíncrona para poder leer, en la consola del navegador, Hola inmediatamente sin esperar la función heavyLoad() pero no puedo hacerlo: he intentado crear una promesa objeto; Traté de usar la palabra clave async pero nada funciona, ya que siempre tengo que esperar a que termine la función heavyLoad() antes de leer Hello .
¿Es posible hacer que heavyLoad() funcione, esencialmente tal como es, asíncrono como quise decir?
Puedes usar WebWorker y Promise
Escriba su script de carga pesada en un archivo separado.
trabajador.js
onmessage = function(e) { let startTime = (new Date()).getTime(); while(new Date().getTime() < startTime + e.data); postMessage(true); }Ejecute ese webWorker en el archivo de script principal.
principal.js
function heavyLoad(delay) { return new Promise((resolve, reject) => { var myWorker = new Worker('worker.js'); myWorker.postMessage(delay); myWorker.addEventListener('message', function(e) { // Log the workers message. resolve(e.data); }, { once: true }); }) } console.log("Starting") console.time() heavyLoad(5000).then(data=>{ console.timeEnd() }) console.log("end")(Aquí estoy usando el método console.time para realizar un seguimiento del tiempo de ejecución)
Para el tiempo de espera, existe el método setTimeout() en javascript.
Así que simplemente puedes usar:
setTimeout(() => { console.log("Hello"); }, 5000);Intente seguir el código para comprender el trabajo asíncrono
function heavyLoad(delay) { return new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve(true) },delay) }) } heavyLoad(5000).then(value=>{ console.log(value) }); console.log("Hello"); Primero imprimirá hello cuando ejecute el código y true después de 5 segundos.