Node.js
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.
Örnek çözümü göster
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);
});
});
Kendini test et
-
Callback hell belirtilerini eşle
- 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
-
Hangisi callback hell belirtisidir?
- İç içe geçmiş piramit girinti
- Tek satırlık fonksiyon
- Düzgün hata yönetimi
- Azaltılmış girinti
Cevabı göster
İç içe geçmiş piramit girinti — iç içe callback'ler piramit biçiminde girinti üretür.
-
İç içe callback
loadUser(id, function (err, user) {
loadPosts(user, function (____, posts) {
console.log(posts);
});
});
Cevabı göster
loadUser(id, function (err, user) {
loadPosts(user, function (err, posts) {
console.log(posts);
});
});
Sıradaki ders: Özet - Callback'ler