JavaScript: comportamiento extraño en el bucle forEach

Mi código se ve así:

someArray.forEach(x => { // do something console.log('calling api for ' + x); callAnHttpApiAsync(...); sleep(10); }); 

La llamada a la api de http es async (pero no uso ninguna syntax de espera / async) y registra algo una vez que la api envía la respuesta. Lo que sucede es que el bucle forEach se completa y comienzo a ver las respuestas registradas SOLO DESPUÉS de eso. Espero ver algunas respuestas antes de que termine el ciclo (intenté boost la cantidad de sueño), pero no importa cuánto tiempo espere o durante cuánto tiempo se registran las respuestas, una vez que finaliza el ciclo. Yo uso una biblioteca de sueño de nodo. Veo algo como esto:

 calling api for 1 calling api for 2 calling api for 3 ... calling api for 10000 got response for 1 got response for 2 got response for 3 ... got response for 10000 

Ya resolví este problema usando for-of y espere / async (por favor, avíseme si tiene mejores ideas), pero no puedo entender la razón de este extraño comportamiento. ¿Por qué recibo las respuestas solo después del ciclo completo? ¿Algunas ideas? Lo siento por el formato pero estoy en el móvil.

Revelación completa: Realmente no sé node.js, solo javascript del lado del cliente, pero creo que la explicación también funciona aquí.

El quid de la cuestión es que “asíncrono” no significa “paralelo”. Cuando llama a una operación asíncrona, se coloca en una cola. Cuando JSVM termina de ejecutar el código que está ejecutando actualmente (que en este caso es el código que contiene su forEach ), solo entonces toma la primera operación en la cola asíncrona y la ejecuta; luego, cuando eso termina, se ejecuta el siguiente, y así sucesivamente. Es decir, no importa cuántos trabajos asíncronos empieces, solo uno se ejecutará a la vez.