CodeBlanks Logo Icon CodeBlanks

Callback hell

Callback hell ve nasıl önleneceğini öğrenirsin.

Callback hell

Birden fazla callback'i iç içe çağırdığında kod piramit biçimini alır. Bu duruma callback hell (callback cehennemi) denir; kodu okumak ve bakımını yapmak zorlaşır.

Örnek: loadUser(id, function (err, user) { loadPosts(user, function (err, posts) { loadComments(posts, function (err, comments) { ... }); }); });. Her çağrı bir öncekinin callback'ine gömülür; girinti sürekli artar.

Bu desen yaygın bir sorundur. İç içe geçmiş callback'ler hata yönetimini, akışı izlemeyi ve mantığı sürdürmeyi zorlaştırır. Node.js topluluğu daha sonra promise ve async/await ile bu sorunu çözmüştür; bu konuları ileride göreceksin.

Named functions ile çözüm

Callback hell'i azalmanın yollarından biri, anonim fonksiyonlar yerine adlandırılmış fonksiyonlar kullanmaktır. Her adımı ayrı bir fonksiyona taşımak girintiyi azaltır ve kodu okunaklı yapar.

Örnek: loadUser(id, onUser); function onUser(err, user) { loadPosts(user, onPosts); } function onPosts(err, posts) { ... }. Burada her adımın kendi adı ve gövdesi vardır; iç içe geçme azalır.

Named functions aynı zamanda hata izini (stack trace) daha okunaklı yapar. Yine de en kalıcı çözüm promise ve async/await'tir; bu konuları ileri seviyede ayrıntılı göreceksin.

Uygulama İç içe iki çağrı

loadUser(id, cb) fonksiyonunu tanımla: cb(null, { name: 'Ayşe' }) çağrısı yapsın. Sonra loadPosts(user, cb) fonksiyonunu tanımla: cb(null, ['a', 'b']) çağrısı yapsın. loadUser(1, (err, user) => { loadPosts(user, (err2, posts) => { console.log(user.name + ': ' + posts.length); }); }) biçiminde iç içe çağır.

Başlangıç kodu

index.js
// loadUser ve loadPosts fonksiyonlarını tanımla, iç içe çağır

Örnek çözüm

index.js
function loadUser(id, cb) {
  cb(null, { name: 'Ayşe' });
}
function loadPosts(user, cb) {
  cb(null, ['a', 'b']);
}
loadUser(1, (err, user) => {
  loadPosts(user, (err2, posts) => {
    console.log(user.name + ': ' + posts.length);
  });
});

Beklenen çıktı

Ayşe: 2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Callback hell belirtilerini eşle

Kavram Anlamı
Piramit girinti İç içe geçmiş yapı
Artan derinlik Girintinin sürekli büyümesi
Zor hata yönetimi Her katmanda err kontrolü
Promise Çözüm yöntemlerinden biri

2 Hangisi callback hell belirtisidir?

  • İç içe geçmiş piramit girinti Doğru cevap
  • Tek satırlık fonksiyon
  • Düzgün hata yönetimi
  • Azaltılmış girinti

Açıklama: iç içe callback'ler piramit biçiminde girinti üretür.

3 İç içe callback

Soru
loadUser(id, function (err, user) {
  loadPosts(user, function (____, posts) {
    console.log(posts);
  });
});
Cevap
loadUser(id, function (err, user) {
  loadPosts(user, function (err, posts) {
    console.log(posts);
  });
});

Açıklama: iç callback de error-first sözleşmesine uyar: ilk parametre err.

Başlangıç bölümündeki tüm dersler