JavaScript asenkron programlama beni birkaç kez duvara götürdü. Senkron dillere alışmış biri olarak "sırası gelmeden çalışan kod" kavramı kafamda somut bir şekil oluşturmuyordu. İlk kez callback gördüğümde anlıyormuşum gibi hissettim. Fonksiyon içinde fonksiyon. Tamam. Ama pratikte bir şeyler yazmaya çalışınca o iç içe fonksiyonlar büyüdü ve büyüdü. "Callback hell" denen şeyin içindeydim ve kodumu okuyamıyordum artık. Hata mesajı nereden geliyor bilmiyordum. JavaScript asenkron programlama öğrenirken Promise yapısına geçtiğimde nefes aldım. Zincirleme `.then()` mantığı daha okunabilirdi. Ama hatalar konusunda kafam karıştı yine. `.catch()` nereye koyacağımı, hangi hatanın nerede yakalanacağını anlayamıyordum. Bir üst seviyedeki `.catch()` alt seviyedeki hatayı yakalıyor muydu? Bunu anlamak deneme-yanılmayla öğrendim. Async/await gelince şöyle bir rahatlama yaşandı: "İşte bu!" dedim. Senkron kod gibi yazıyorsun ama asenkron çalışıyor. Mükemmel. Ama o `await` anahtar kelimesini her yere koymaya başladım. `async` olmayan fonksiyonun içine `await` koyunca hata aldım. Döngü içinde await kullanınca paralel değil sıralı çalıştığını fark ettim, istediğim bu değildi. JavaScript asenkron programlama beni en çok zorladığı an Promise.all ile hata yönetimini birlikte kullanmak gerektiğinde oldu. Bir promise hata verirse diğerleri ne oluyor? Hepsini yakalamak için ne yapmalıyım? Bu soruları cevaplamak günler sürdü. Geriye bakınca şunu görüyorum: JavaScript asenkron programlamayı öğrenmenin en iyi yolu soyut anlatımı bırakıp gerçek bir senaryo üzerinde defalarca hata yapmak. Ben bunu yaptım ve her hata bir şeyi yerleştirdi. Sihirli bir "anladım" anı yoktu, yalnızca birikim vardı.