Callbacks: Asenkron Programlamanın Temeli
Örneğin, bir API’den veri almak için yapılan bir asenkron işlemde callback kullanarak veri alındığında ne yapılacağına karar verebilirsiniz.
Örnek:
function veriAl(callback) {
setTimeout(() => {
console.log('Veri alındı!');
callback();
}, 2000);
}
veriAl(function() {
console.log('Callback fonksiyonu çalıştı!');
});
Bu kod parçasında, `veriAl` fonksiyonu asenkron bir işlem gerçekleştiriyor ve işlem tamamlandığında callback fonksiyonu çalışıyor. Ancak işler büyüdükçe ve callback sayısı arttıkça, kodunuz karmaşıklaşır. Bu durumu "callback hell" olarak adlandırıyoruz. Peki, bu karmaşadan nasıl kurtulabiliriz?
Promises: Callback Hell’den Kurtulma Yolu
Promise kullanarak, işlemlerinizi zincirleme şekilde düzenleyebilirsiniz. Böylece, bir işlem tamamlandığında bir sonrakine geçebilirsiniz.
Örnek:
function veriAl() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Veri alındı!');
resolve();
}, 2000);
});
}
veriAl().then(() => {
console.log('Promise fonksiyonu çalıştı!');
});
Görüldüğü gibi, resolve() fonksiyonu, işlemin başarılı bir şekilde tamamlandığını belirtiyor. Eğer bir hata oluşursa, reject() fonksiyonu hata mesajını döndürür. Promises zincirleri, karmaşık işlemleri daha yönetilebilir hale getirir. Ancak yine de bir noktada kodlar daha karmaşık hale gelebilir.
Async/Await: Asenkron Kodun Senkron Görünmesi
Örnek:
async function veriAl() {
console.log('Veri alınıyor...');
await new Promise(resolve => setTimeout(resolve, 2000));
console.log('Veri alındı!');
}
veriAl();
Burada, `await` ifadesi Promise’in tamamlanmasını bekler. Kodu senkron bir biçimde yazmanıza imkan tanır, ancak hala asenkron bir şekilde çalışır. `await` kullanırken, fonksiyonun başında `async` anahtar kelimesini unutmayın!
Callbacks vs Promises vs Async/Await: Hangisini Ne Zaman Kullanmalısınız?
1. Callback’ler: Basit işlemler için ideal, ancak karmaşık ve uzun kodlarda zorlayıcı olabilir.
2. Promises: Callback'lerle karşılaştırıldığında daha temiz ve yönetilebilir. Zincirleme işlemler için mükemmel.
3. Async/Await: Kodunuzu senkronmuş gibi yazmanıza olanak tanır. Daha okunabilir ve bakımı kolaydır. Ancak, Promise’ler hakkında bilgi sahibi olmanız gereklidir.
Hata Yönetimi: Asenkron Kodda Zorluklar
- Promises: Hata yönetimi `.catch()` yöntemi ile yapılır.
- Async/Await: `try-catch` bloklarıyla hata yakalanır. Bu, senkron kod yazıyormuş gibi hissettirir.
Örnek:
async function veriAl() {
try {
// Asenkron işlem
let sonuc = await new Promise((resolve, reject) => {
reject('Bir hata oluştu!');
});
} catch (error) {
console.log('Hata:', error);
}
}
veriAl();
Sonuç: En İyi Asenkron Seçimi
Asenkron programlama ilk bakışta karmaşık olabilir, ancak doğru araçlarla, kodunuzu daha temiz, anlaşılır ve etkili hale getirebilirsiniz. İster yeni başlayan bir geliştirici olun, ister deneyimli bir yazılımcı, bu konulara hakim olmak işlerinizi kolaylaştıracaktır.