1. Callback Hell Nedir ve Neden Oluşur?
İşte örnek bir callback hell:
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doAnotherThing(newResult, function(finalResult) {
console.log(finalResult);
});
});
});
Gördüğünüz gibi, her bir işlem başka bir işleme bağlı ve birbirine zincirlenmiş durumda. Bu yapı, zamanla kodun okunabilirliğini ve bakımını zorlaştırır.
2. Promise Kullanarak Daha Temiz Kodlar Yazın
Örneğin, yukarıdaki callback hell'i Promise ile şu şekilde yazabiliriz:
doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doAnotherThing(newResult))
.then(finalResult => console.log(finalResult))
.catch(error => console.error(error));
Promise yapısı, kodu daha lineer ve okunabilir hale getirir. Ayrıca hata yönetimini de çok daha kolaylaştırır.
3. Async/Await ile Asenkron Kodları Daha Akıcı Hale Getirin
Örneğin, Promise ile yazılan yukarıdaki kodu async/await kullanarak şu hale getirebiliriz:
async function processData() {
try {
const result = await doSomething();
const newResult = await doSomethingElse(result);
const finalResult = await doAnotherThing(newResult);
console.log(finalResult);
} catch (error) {
console.error(error);
}
}
processData();
Bu yapı, hem okunabilirliği artırır hem de daha temiz bir asenkron kod yazmanıza olanak sağlar.
4. Callback Fonksiyonlarını Ayırın ve Modüler Hale Getirin
Örneğin, yukarıdaki callback yapısını şu şekilde ayırabiliriz:
function processFirstStep() {
return new Promise((resolve, reject) => {
// İşlemi yap
resolve(result);
});
}
function processSecondStep(result) {
return new Promise((resolve, reject) => {
// İşlemi yap
resolve(newResult);
});
}
function processThirdStep(newResult) {
return new Promise((resolve, reject) => {
// İşlemi yap
resolve(finalResult);
});
}
processFirstStep()
.then(processSecondStep)
.then(processThirdStep)
.then(finalResult => console.log(finalResult))
.catch(error => console.error(error));
Bu yöntemle, her bir adımı tek bir fonksiyonla yönetebiliriz ve kodumuzun bakımı çok daha kolay hale gelir.
5. Event Emitters Kullanarak Callback’leri Yönetme
Örneğin, Event Emitter ile şöyle bir yapı kurabiliriz:
const EventEmitter = require('events');
const eventEmitter = new EventEmitter();
eventEmitter.on('step1Complete', (result) => {
console.log('Adım 1 tamamlandı: ', result);
eventEmitter.emit('step2Complete', newResult);
});
eventEmitter.emit('step1Complete', result);
Bu yöntemle, olayları birbirinden bağımsız bir şekilde yönetebilir ve kodunuzu daha esnek hale getirebilirsiniz.
Sonuç: Callback Hell’den Kurtulun ve Daha Verimli Kodlar Yazın
Gelin, kodunuzu daha temiz tutun ve geliştirme sürecinizdeki her adımda daha verimli bir yol izleyin!