Según entendí, esperaba que se imprimieran según el tiempo de resolución de cada uno (luego de que la pila de llamadas esté vacía), para finalmente imprimir el mensaje setTimeout().
Sin embargo, todas las soluciones se imprimen cuando se completa la tarea que consume más tiempo . Específicamente, solo cuando se completa la operación de promesa de la segunda llamada a recursionSecond(), todas las demás también se imprimen.
setTimeout(() => console.log('timeout in 0'), 0); function recursionFirst(number) { return new Promise((resolve, reject) => { for(let i = 0; i > (number * (-1)); i--) { if(i === (number * (-1)) + 1) resolve(i) } }) } function recursionSecond(number) { return new Promise((resolve, reject) => { for(let i = 0; i < number; i++) { if(i === number - 1) resolve(i) } }) } recursionFirst(40) .then(x => console.log(x)) recursionFirst(400) .then(x => console.log(x)) recursionFirst(400) .then(x => console.log(x)) recursionSecond(10) .then(x => console.log(x)) recursionSecond(2000000000) .then(x => console.log(x)) recursionSecond(1000) .then(x => console.log(x)) console.log("Hi!")