Callback Fonksiyonlarının Temelleri
Örneğin, bir dosya okuma işlemi veya veritabanı sorgusu gerçekleştirdiğinizde, bu işlemler bitene kadar kodunuzun geri kalanı çalışmaya devam eder. Callback, işte tam burada devreye girer. Bu işlem tamamlandığında, bir callback fonksiyonu devreye girer ve ilgili işlemi başlatır.
```javascript
function fetchData(callback) {
setTimeout(() => {
console.log("Veriler alındı");
callback(); // Callback fonksiyonu çağrılır
}, 2000);
}
fetchData(() => {
console.log("Callback fonksiyonu çalıştı!");
});
```
Yukarıdaki örnekte, `fetchData` fonksiyonu verileri aldıktan sonra, callback fonksiyonu çalıştırılır. Ancak bu basit kullanım, bazen karmaşık hale gelebilir. İşte tam da burada, "callback hell" adı verilen sorun devreye girer.
Callback Hell ve Çözümü
Bu durumu engellemek için daha güçlü yapılar kullanmak gereklidir. İşte burada Promise'ler devreye giriyor.
Promise Yapısı ve Hayatımıza Girişi
Promise nesnesi, üç durumdan birinde olabilir:
- Pending: Henüz tamamlanmamış, bekleyen bir işlem.
- Fulfilled: Başarıyla tamamlanmış işlem.
- Rejected: İşlem başarısız olmuş.
Örneğin, bir API'den veri çekmek için Promise kullanabilirsiniz:
```javascript
let fetchData = new Promise((resolve, reject) => {
let success = true;
setTimeout(() => {
if (success) {
resolve("Veriler başarıyla alındı");
} else {
reject("Bir hata oluştu");
}
}, 2000);
});
fetchData
.then(result => console.log(result)) // Başarılı sonuç
.catch(error => console.log(error)); // Hata durumu
```
Yukarıdaki örnekte, `fetchData` promise'i başarılı bir şekilde tamamlanırsa, `then()` metodu çalışır, aksi takdirde `catch()` metodu hata mesajını gösterir.
Async/Await Yapısı ve Kullanımı
Async/Await kullanmak oldukça basittir. `async` fonksiyonları, bir Promise dönerken, `await` anahtar kelimesi ise Promise'in tamamlanmasını bekler.
```javascript
async function getData() {
let result = await fetchData;
console.log(result);
}
getData();
```
Bu örnekte, `await` ile Promise'in sonucu bekleniyor ve ardından işlem devam ediyor. Bu, kodu senkron bir şekilde yazmanıza olanak tanır, fakat aslında hala arka planda asenkron bir işlem gerçekleşmektedir.
Callback, Promise ve Async/Await Arasındaki Farklar
1. Callback: Asenkron işlemleri gerçekleştiren ilk yapıdır, ancak karmaşıklaştığında anlaşılması zor hale gelir.
2. Promise: Callback'lere kıyasla daha temiz bir yapıdır. Promise, başarı ya da hata durumlarını işlemek için `.then()` ve `.catch()` metotlarını kullanır.
3. Async/Await: En modern ve sezgisel yapıdır. Kodunuzu senkron yazmanıza olanak sağlar, ancak aslında asenkron bir işlem yapar.
Hangi Durumda Hangi Yapıyı Kullanmalısınız?
- Daha büyük ve karmaşık projelerde, Promise kullanmak işinizi kolaylaştırır. Daha net hata yönetimi ve işlem sıralaması sağlar.
- En okunabilir ve modern çözüm için, Async/Await'i tercih etmelisiniz. Bu yapı, kodunuzu daha okunabilir ve yönetilebilir hale getirecektir.
Asenkron Hatalarla Baş Etme
- Callback ile çalışıyorsanız, hata durumlarını `try/catch` yerine callback fonksiyonları ile yönetmelisiniz.
- Promise kullanırken, `.catch()` metodunu kullanarak hata durumlarını ele alabilirsiniz.
- Async/Await yapısında ise, `try/catch` bloğu ile hataları yönetebilirsiniz.
```javascript
async function fetchData() {
try {
let result = await someAsyncFunction();
console.log(result);
} catch (error) {
console.log("Hata oluştu:", error);
}
}
```