El bucle dentro de la promesa funciona como un código de sincronización, por ejemplo:
console.log('im working') function proLoop(){ return Promise((resolve ,rejects)=>{ for (let i = 0; i < 1000000000000; i++) {} console.log('loop is done') }) } proLoop(); console.log('im working')Entonces, incluso si escribimos es como una promesa, obtendrá más tiempo y congelará nuestro código. En otras palabras, funcionará sincrónicamente.
Encontré una solución, pero ¿por qué funciona?
entonces la solución es simplemente deformar su código como una promesa resuelta
como esto
return new Promise.resolve().then( ()=>{ for (let i = 0; i < 1000000000000; i++) {} console.log('loop is done') })pero porque y como???
Un par de cosas que debes entender aquí:
Las promesas no hacen que algo sea asíncrono : son un mecanismo de notificación para algo que ya es asíncrono. Las promesas le notifican el éxito o el fracaso de una operación que ya es asíncrona.
La función de devolución de llamada del constructor de la promesa se llama sincrónicamente ; se llama sincrónicamente para iniciar una operación que ya es asíncrona.
En su caso, el constructor de promesas contiene código síncrono; es por eso que bloquea otro código.
Mover el bucle dentro de la función de devolución de llamada de then ejecuta el bucle de forma asíncrona porque la función de devolución de llamada de then se invoca de forma asíncrona.
Nota: Aunque la función de devolución de llamada del método then invoca de forma asincrónica, una vez que comienza a ejecutarse, no se ejecutará ningún otro código hasta que el código síncrono dentro de la devolución de llamada se ejecute por completo.
En ambos casos, el ciclo for bloqueará el ciclo del evento principal. La diferencia es cuando comienza el bucle for .
En el primer caso, la función pasada a new Promise se ejecuta inmediatamente . Por lo tanto, bloquea el resto de la función que lo crea.
En el segundo caso, la función pasada a then() se pone en cola para ejecutarse la próxima vez que el bucle de eventos esté libre. Por lo tanto, la función que lo creó termina primero y luego se ejecuta el bucle for . (Si ese es el objetivo, entonces es un enfoque bastante poco intuitivo, y usar setImmediate (en los navegadores) o el proceso de process.nextTick() sería más ordenado).
Si desea desviar el trabajo realizado por el ciclo for del ciclo del evento principal para que no bloquee nada, debe usar un Web Worker o un subproceso Worker según el tiempo de ejecución de JavaScript que esté usando.