Callback Hell denen o meşhur 'indent ormanı' kod yapısından bahsediyorum. Sürekli nested callback'lerle boğuşunca fonksiyonlar okunmaz hale geliyor. Peki bu durumu düzeltecek en temiz yöntemler hangileri? Mesela Promise zincirleri gerçekten kurtarıcı mı yoksa sadece geçici bir bandaj mı? Topluluk olarak neler kullanıyorsunuz?
Callback Hell nedir ve nasıl kurtuluruz?
👁️ 2 görüntüleme💬 1 cevap❤️ 0 beğeni
1 Cevap
Callback hell denen şey aslında hepimizin javascript/async JS kodlarında en az bir kez boğuştuğu o derin girintili if-else ve nested fonksiyon ormanı kanka. Temel dert şu: her async işlem bittikten sonra bir callback çağırmak zorunda kalınca callback'in içinde bir callback, o callback'in içinde başka bir callback... "pyramid of doom" diye de geçiyor buna. JS dünyasında buna karşı Promise'ler çıktı valla, o da yetmediğinde Promise zincirleriyle çözmeye çalıştık. Ama Promise'lerin de microtask kuyruğunda birikip event loop'u tıkadığı senaryolar var, hele bir de hata yönetimi iyice karmaşıklaşıyor (unhandled rejection'lar vs).
Modern JS'in kurtarıcısıysa async/await doğal kanka. Temelde Promise'lerin syntax şekerinden başka bir şey değil ama okunabilirlik devrim gibi. Aşağıdaki kod callback hell'i nasıl kurtarıyor görelim:
```javascript
// Callback Hell
fs.readFile('dosya.txt', 'utf8', (err, data) => {
if (err) throw err;
fs.readFile(data, 'utf8', (err2, data2) => {
if (err2) throw err2;
console.log(data2);
});
});
// Async/await versiyonu
try {
const data = await fs.promises.readFile('dosya.txt', 'utf8');
const data2 = await fs.promises.readFile(data, 'utf8');
console.log(data2);
} catch (err) {
console.error(err);
}
```
Görüyorsun değil mi, sanki synchronous kod gibi yazabiliyoruz. Node.js'in fs/promises modülüyle artık her şeyi Promise temelinde yapmak mümkün. Rust tarafında da tokio async-await ile benzer bir rahatlık var, future'ları await'liyorsun. Ama dikkat et, bu senkronizasyon illüzyonu - aslında arka planda event loop dönüyor, deadlock'lardan kaçınmak için mutex'leri doğru kullanmak şart.
Toplulukta en çok tercih edilenler:
1. Node.js: async/await + fs/promises
2. Tarayıcı: Promise chaining + async/await
3. Rust: tokio async/await + futures
4. Python: asyncio
5. Eskilerden kurtulup "reactive programming" denen RxJS/RxPy'ye geçiş trend olarak var.
Sonuçta callback hell'i yenmenin asıl yolu: codebase'i synchronous-looking async pattern'lerle yazıp, error handling'i try/catch'le basitleştirmek. En temiz yol bu, bence.
Tartışmaya katılmak için giriş yap
Giriş Yap