JavaScript async/await ve Promise Nedir?
JavaScript async/await, Promise ve event loop kavramı net açıklamayla: callback hell'den promise chain'e, .then().catch()'den async/await'e, paralel-await sıralı-await farkı, mulakat tuzakları.
Closetrafi bosalt
Asenkron programlama JavaScript'in en can alici konusu. Closure ve hoisting ne kadar kafa karistiriyorsa, async/await da o kadar. Mulakatlarda "asenkron" denince 4-5 farkli soru gelir: callback hell, Promise, async/await, event loop, microtask queue. Bu yazida hepsini toparliyoruz.
Once yalin ifadeyle: JavaScript tek is parcacikli (single-threaded) calisir. Yani bir anda sadece tek sey yapabilir. Peki tarayicimiz nasil yuzlerce seyi ayni anda yapiyor? Cevap: asenkron programlama. Fonksiyonu cagir, "bitince haber ver" de, arada baska is yap. Iste async/await ve Promise bu "haber ver" mekanizmasini duzgun bir sekilde yazmamizi saglar.
Benzetme: Restoranda sipariş
Bir restorandasın. Garson siparişi alır, mutfağa götürür (uzun süren iş), sen bu sirada başka masalara da bakar, yemek gelince tabağı alırsın. Asenkron programlama bu: uzun süren bir iş başlat, bitmesini bekle, arada başka şeyler yap.
JavaScript'te bu "uzun süren iş" genelde:
- API çağrısı (fetch, axios)
- Veritabanı sorgusu
- Dosya okuma/yazma
- setTimeout, setInterval
- Event listener'lar
Bu işler "biter" ve sonuç döner — ya da hata verir. Promise bu sonucu temsil eden nesne, async/await ise onu "bekleyen" söz dizimi.
Callback → Promise → async/await evrimi
Asenkron JavaScript 3 evreden gecti. Hepsini gormek lazim — mulakatlarda "callback hell nedir" diye sorarlar.
1. Callback (eski stil — 2010 öncesi)
// Kullanici getir, sonra o kullanicinin postlarini getir
getUser(userId, function(user) {
getPosts(user.id, function(posts) {
renderUI(user, posts);
});
});
// 3-4 ic ice callback → "callback hell" (kayisifa kroniklesmesi)
// Kod okunamaz, hata yonetimi zor (her callback icin ayri try/catch)Sorun: ic ice callback → kod sagdan sola uzayan piramit, hata yonetimi zor.
2. Promise (ES6 — 2015)
// Ayni is — Promise zinciri
getUser(userId)
.then(user => getPosts(user.id))
.then(posts => renderUI(user, posts))
.catch(err => console.error(err));
// Daha iyi: zincir dikey, tek catchIyilesme: zincir dikey (piramit yok), tek .catch() ile merkezi hata yonetimi.
3. async/await (ES8 — 2017, modern standart)
// Ayni is — async/await ile senkron gibi yazilir
async function kullaniciGoster(userId) {
try {
const user = await getUser(userId);
const posts = await getPosts(user.id);
renderUI(user, posts);
} catch (err) {
console.error(err);
}
}
kullaniciGoster(42);En iyi: senkron koda benziyor, try/catch ile klasik hata yonetimi, okumasi en kolay.
async/await temelleri
Iki kelime oyunu: async ve await. Birlikte calisirlar.
// async: fonksiyonu "asenkron" olarak isaretle
// Her async fonksiyon bir Promise doner
async function selamVer(isim) {
return "Merhaba " + isim;
}
// Kullanim: iki yol var
selamVer("Ali").then(mesaj => console.log(mesaj)); // Promise gibi
const mesaj = await selamVer("Ali"); // await ile
console.log(mesaj); // "Merhaba Ali"// await: Promise'in bitmesini bekle
// SADECE async fonksiyon icinde calisir
async function kullanicininPostlari(userId) {
const user = await getUser(userId); // once user gelsin
const posts = await getPosts(user.id); // sonra posts
return { user, posts };
}
// await olmadan:
function kullanicininPostlari(userId) {
return getUser(userId)
.then(user => getPosts(user.id).then(posts => ({ user, posts })));
}asyncfonksiyon her zaman bir Promise donerawaitSADECEasyncfonksiyon icinde calisirawait, Promise'inresolveolmasini bekler, sonra degeri doner
Hata yönetimi (try/catch)
async/await'in en buyuk avantaji: klasik try/catch ile hata yakalama. Promise'lerdeki .catch() zincirinden daha temiz.
// DOGRU — async/await + try/catch
async function kullanicininVerileri(userId) {
try {
const user = await getUser(userId);
const posts = await getPosts(user.id);
return { user, posts, hata: null };
} catch (err) {
console.error("API hatasi:", err);
return { user: null, posts: [], hata: err.message };
}
}// BIRDEN FAZLA await — bir hata tum zinciri durdurur
async function a() { await getA(); }
async function b() { await getB(); }
async function hepsi() {
try {
const aData = await a();
const bData = await b(); // a() hata verirse b() calismaz
} catch (err) {
// a() veya b() hatasi buraya dusuyor
}
}
// COZUM: Promise.allSettled — hepsini bekle, hatta varsa devam et
async function hepsiBagimsiz() {
const sonuclar = await Promise.allSettled([a(), b()]);
// [fulfilled, rejected] veya [fulfilled, fulfilled] gibi doner
// Hata olsa bile hepsi beklenir
}"3 paralel API cagir, biri hata verse ne olur?" Cevap: Promise.all hatayla tum zinciri durdurur. Promise.allSettled hata olsa bile hepsini bekler, hata durumunu {status: "rejected"} olarak doner. Hangisini ne zaman kullanacagini bilmek mulakatta +3 puan.
Promise.all — paralel vs sıralı
3 API cagiracaksin. Nasil yazarsin?
// YANLIS — sirali, yavas (1sn + 1sn + 1sn = 3sn)
const a = await apiA(); // 1sn
const b = await apiB(); // 1sn (a bittikten sonra)
const c = await apiC(); // 1sn (b bittikten sonra)
// DOGRU — paralel, hizli (max(1,1,1) = 1sn)
const [a, b, c] = await Promise.all([apiA(), apiB(), apiC()]);
// Promise.all hepsini ayni anda baslatir, hepsinin bitmesini bekler
// Bir hata olursa tum zincir durur (reject)- Sirali await: B sonucu A'ya bagliysa (B = A + 1 islem)
- Promise.all: B, C A'dan bagimsiz (ayri tablolar, paralel API)
- Promise.race: En hizli biteni istiyorsan (timeout pattern)
Event loop — sıralama sihri
Bu JavaScript mulakatinin en klasik tuzagi. Sadece oku, sonra calistir:
console.log("1");
setTimeout(() => console.log("2"), 0);
Promise.resolve().then(() => console.log("3"));
console.log("4");
// Cikti: 1, 4, 3, 2 — neden?Neden 1, 4, 3, 2?
console.log("1")senkron → ekrana 1setTimeoutmacrotask kuyruguna eklenir (en sona kalir)Promise.thenmicrotask kuyruguna eklenirconsole.log("4")senkron → ekrana 4- Call stack bosalinca: once microtask (3), sonra macrotask (2)
- Senkron kod (call stack)
- Microtask queue (Promise'ler, queueMicrotask)
- Macrotask queue (setTimeout, setInterval, I/O)
- Render (ekran ciz)
Her macrotask arasinda microtask'lerin hepsi bitirilir. Bu yuzden await / .then() setTimeout'tan once calisir.
Mulakat SSS
JavaScript'te async/await nedir, en basit şekilde nasıl açıklanır?
async/await, JavaScript'te asenkron (eşzamansız) kod yazmanın modern yoludur. Bir fonksiyonun başına 'async' yazarsan, içinde 'await' kullanabilirsin. await, bir Promise'in sonuçlanmasını bekler ama bu sırada JavaScript motoru diğer işleri yapmaya devam eder (event loop). Sonuç: senkron gibi görünen, ama aslında bloklamayan kod.
Promise ile async/await arasındaki fark nedir?
Promise, asenkron bir sonucu temsil eden nesnedir. async/await ise Promise'leri kullanmanın söz dilidir (syntactic sugar). async fonksiyon her zaman bir Promise döner. await ise sadece async fonksiyonlar içinde çalışır ve bir Promise'in resolve olmasını bekler. İkisi de aynı işi yapar; async/await kodu okumayı kolaylaştırır.
JavaScript'te 'callback hell' nedir?
Callback hell, birbirinin içine geçmiş iç içe callback fonksiyonlarından oluşan kodun okunamaz hale gelmesidir. Promise'ler ve async/await bu sorunu çözer: asenkron akışı düz (linear) bir kod gibi yazabilirsin, iç içe callback yığını yerine.
Promise.all ve sıralı await arasındaki fark nedir?
Sıralı await: A işi bitmeden B başlamaz, toplam süre = A + B. Promise.all([A, B]): A ve B paralel başlar, toplam süre = max(A, B). Bağımsız işler için Promise.all kullan, bağımlı işler için sıralı await.
JavaScript'te event loop nedir?
Event loop, JavaScript'in tek iş parçacıklı (single-threaded) yapısında asenkron işleri sıraya koyup yöneten mekanizmadır. Call stack boşaldığında, microtask queue (Promise'ler) önce, sonra macrotask queue (setTimeout, I/O) işlenir. Bu yüzden await'ler setTimeout'tan önce çalışır.
Mulakat sorusu: '1, setTimeout 0, Promise.then, 4' çıktısı ne olur?
Çıktı: 1, 4, 3, 2. Çünkü: 1 senkron yazılır. setTimeout macrotask, en sona kalır. Promise.then microtask, call stack boşalınca hemen çalışır. 4 senkron yazılır. Call stack boşalınca microtask (3) çalışır, sonra macrotask (2). Bu klasik event loop sorusudur.
Bir cümlede özet
async/await, JavaScript'in "uzun süren işleri beklerken diğer işleri yapmaya devam etmesini sağlayan" söz dizimi. Callback hell'den kurtarır, kodu senkron gibi gösterir ama aslında asenkrondur.
Modern projelerde async/await standart. fetch, axios, veritabanı sorguları, dosya işlemleri — hepsi Promise tabanlı, hepsi async/await ile yazılır. Bu üç yazıyı (closure, hoisting, async/await) bir oturuşta oku — JavaScript mülakatlarının %80'ini geçersin.
İlgili Yazılar
async/await öğrendin, üçlü tamam
JavaScript'in en çok sorulan 3 mülakat konusunu (closure, hoisting, async/await) tamamladın. Sıradaki: this, prototype, event loop.