Sé que suena estúpido porque javascript tiene un solo subproceso, pero no puedo evitar pensar en una función que lleva una cantidad de tiempo inusual sin la participación de API web como esta
console.log("start") function apple() { let appleCount = 10; while (appleCount < 1000000) { appleCount = appleCount + 10; appleCount = appleCount * 0.0000052 } } apple(); console.log("end")Entonces, ¿hay alguna manera de ejecutar esta función de Apple de forma asincrónica? Intenté ejecutar este código en el navegador pero no obtuve ningún resultado... ayúdenme...
La única forma de ejecutar algo que es 100% Javascript simple como su función apple() para que no bloquee el hilo principal es ejecutarlo en un hilo diferente (en nodejs, para usar un WorkerThread) o en un proceso diferente .
Como parece saber, el subproceso principal ejecuta su Javascript en un solo subproceso, por lo que cualquier cosa que sea simplemente JavaScript ocupa ese único subproceso mientras se ejecuta. Para que no ocupe ese único subproceso y bloquee el bucle de eventos, debe ejecutarlo en un subproceso diferente, ya sea un WorkerThread o ejecutarlo en otro proceso.
Se pueden usar trucos de tiempo como setTimeout(apple, 100) o setImmediate(apple) o incluso Promise.resolve().then(apple) para cambiar CUÁNDO se ejecuta el código (retrasando cuando comienza), pero todos estos trucos de tiempo son cambia cuando el código comienza a ejecutarse. En todos estos casos, cuando se ejecuta, aún bloquea y ocupa el subproceso principal y bloquea el bucle de eventos mientras se ejecuta.
FYI, hay muchas operaciones asincrónicas en nodejs que no son necesariamente API web. Por ejemplo, hay API de archivos asíncronos y API criptográficas que son asíncronas y sin bloqueo. Por lo tanto, su pregunta debe modificarse para que no se refiera solo a las API web, sino a cualquier API asíncrona.
Entonces, ¿hay alguna manera de ejecutar esta función de Apple de forma asíncrona?
Si no desea esperar hasta que se complete su función Apple, puede usar Async Functions .
NOTA: Async/Promises no son verdaderos asíncronos.
console.log("start") async function apple() { let appleCount = 10; while (appleCount < 1000000) { appleCount = appleCount + 10; appleCount = appleCount * 0.0000052 } } apple().then(() => console.log("Apple completed")); console.log("end")Pero si desea ejecutarlo en otro hilo , entonces debe usar Workers
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API
Solo tienes que devolver las promesas.
function double(num) { return Promise.resolve(num * 2); } function add5(num){ return Promise.resolve(num + 5); } double(1)// 2 .then(add5)// 7 .then(double)// 14 .then(console.log)