Aslında çelişkiden ziyade şöyle bir durum var orada. JavaScript aynı anda sadece bir işi yapan ve bir işi bitirmeden diğer işe geçmeyen bir dil. Ancak setTimeout, setInterval veya Promise gibi bloklama yapabilecek bir kod varsa JS yorumlayıcısı bunların sonucunu beklemez yani ilk etapta çalıştırmaz ve kuyruğa gönderir. Sonra sıradaki diğer kodu çalıştırır. En son olarak kuyruktaki işlemleri bitirir. Hatta setTimeout ve setInterval’ in kuyruğu Promise kuyruğundan farklıdır. setTimeout ve setInterval macrotask kuyruğuna gönderilirken promiseler microtask kuyruğuna gönderilir. Bu ikisi arasında da microtask kuyruğundakiler macrotask kuyruğundakilerden önce çağırılıp çalıştırılır.
Umarım faydalı bir cevap olmuştur.