¿Podría alguien tratar de ayudarme a entender por qué la primera función no bloquea mientras que la segunda bloquea el resto del código? ¿No es Promise.resolve lo mismo que resolver desde una new Promise ? No puedo envolver mi cabeza alrededor de eso.
function blockingCode() { return new Promise((resolve, reject) => { for (let i = 0; i < 2500000000; i++) { // Doing nothing... } resolve('ping'); }); } function nonBlockingCode() { return Promise.resolve().then(() => { for (let i = 0; i < 2500000000; i++) { // Doing nothing... } return 'pong'; }); } console.time('non-blocking'); nonBlockingCode().then((message) => console.log(message)); console.timeEnd('non-blocking'); // console.time('blocking'); // blockingCode().then((message) => console.log(message)); // console.timeEnd('blocking');Las dos funciones en realidad están bloqueando.
Tienes la ilusión de que el segundo no está bloqueando porque llamar a Promise.resolve().then() agrega una ronda más al bucle de eventos, así que console.timeEnd('non-blocking'); se alcanza antes de que comience el código dentro de su promesa.
Notarás que ambas funciones se bloquean si arreglas tu código de esta manera:
console.time('non-blocking'); nonBlockingCode() .then((message) => console.log(message)) .then(() => console.timeEnd('non-blocking'));Tenga en cuenta que una promesa tiene la intención de no bloquearse cuando la lógica que lleva mucho tiempo dentro de la promesa se delega a un tercero, y solo espera el resultado (por ejemplo, cuando un cliente realiza una llamada a una base de datos remota, un servidor web remoto , etc.).
Si tiene dificultades con las promesas y then con la lógica, eche un vistazo a la sintaxis async/await , me parece mucho más fácil de entender.