İçeriğe geç

JavaScript Promise Nedir? Detaylı Bir Rehber

Anasayfa

JavaScript Promise Nedir? Detaylı Bir Rehber

JavaScript Promise, sonucu hemen elde edilemeyen asenkron bir işlemin gelecekte başarıyla tamamlanacağını veya hata vereceğini temsil eden nesnedir. API isteği, dosya yükleme, zamanlayıcı ve veritabanı işlemi gibi ne zaman sonuçlanacağı önceden bilinmeyen görevleri yönetmek için kullanılır.

Promise yapısı; başarılı sonuçları then(), hataları catch() ve işlem sonucundan bağımsız olarak çalıştırılacak kodları finally() ile yönetmeyi sağlar. Modern JavaScript’te kullanılan async/await söz dizimi de Promise yapısının üzerine kuruludur.

Kısaca: Promise, JavaScript’e “bu işlem şimdi bitmedi; tamamlandığında sonucu veya hatayı sana bildireceğim” deme yöntemidir.

JavaScript Promise Nedir?

JavaScript Promise, asenkron bir işlemin nihai durumunu ve döndüreceği değeri temsil eder. Promise nesnesi oluşturulduğunda işlem henüz sonuçlanmamış olabilir. İşlem tamamlandığında Promise ya bir değerle başarıya ulaşır ya da bir hata nedeniyle reddedilir.

JavaScript’in genel yapısını, kullanım alanlarını ve temel kavramlarını öğrenmek için JavaScript nedir? rehberini de inceleyebilirsiniz.

Promise Ne Demek?

Promise kelimesinin Türkçe karşılığı “söz” veya “vaat”tir. JavaScript’te ise teknik bir terim olarak İngilizce biçimiyle kullanılır. Bir Promise, henüz tamamlanmayan bir işlemin ileride bir sonuç üreteceğine dair temsili bir söz verir.

Bu sonuç başarılı olduğunda bir değer döner. İşlem başarısız olduğunda ise hata nedeni döner. Promise’ın kendisi sonucu üretmek zorunda değildir; yürütülen asenkron işlemin durumunu ve sonucunu temsil eder.

Promise Durumları Nelerdir?

Bir Promise üç temel durumdan birinde bulunur:

  • Pending (beklemede): Asenkron işlem henüz tamamlanmamıştır.
  • Fulfilled (başarılı): İşlem başarıyla tamamlanmış ve bir değer üretmiştir.
  • Rejected (reddedilmiş): İşlem hata nedeniyle tamamlanamamıştır.

Promise başarıya ulaştığında veya reddedildiğinde artık settled, yani sonuçlanmış kabul edilir. Sonuçlanmış bir Promise yeniden pending durumuna dönmez ve durumu sonradan değiştirilemez.

JavaScript Promise Nasıl Oluşturulur?

Yeni bir Promise oluşturmak için Promise constructor’ı kullanılır. Constructor, resolve ve reject adlı iki fonksiyon alan bir executor fonksiyonu kabul eder.

const siparisHazirla = new Promise((resolve, reject) => {
  const stokVar = true;

  if (stokVar) {
    resolve("Sipariş hazırlandı.");
  } else {
    reject(new Error("Ürün stokta bulunamadı."));
  }
});

resolve() işlemin başarıyla tamamlandığını, reject() ise işlemin hata verdiğini bildirir. Hata durumunda metin yerine Error nesnesi kullanmak hata ayıklama sürecini kolaylaştırır.

then(), catch() ve finally() Nasıl Kullanılır?

then() Metodu

then(), Promise başarıyla tamamlandığında dönen değeri işlemek için kullanılır:

siparisHazirla.then((mesaj) => {
  console.log(mesaj);
});

catch() Metodu

catch(), Promise zincirinde oluşan reddedilmeleri ve fırlatılan hataları yakalar:

siparisHazirla
  .then((mesaj) => console.log(mesaj))
  .catch((hata) => console.error(hata.message));

finally() Metodu

finally(), işlem başarılı da olsa başarısız da olsa çalıştırılır. Yükleniyor göstergesini kapatmak veya geçici kaynakları temizlemek gibi işlemler için uygundur:

siparisHazirla
  .then((mesaj) => console.log(mesaj))
  .catch((hata) => console.error(hata.message))
  .finally(() => console.log("İşlem sona erdi."));

Promise Zinciri Nasıl Çalışır?

then(), catch() ve finally() metodlarının her biri yeni bir Promise döndürür. Bu özellik, birbiri ardına çalışması gereken asenkron işlemlerin zincirlenmesini sağlar.

kullaniciGetir()
  .then((kullanici) => kullanicininSiparisleriniGetir(kullanici.id))
  .then((siparisler) => siparisleriGoster(siparisler))
  .catch((hata) => console.error("İşlem başarısız:", hata));

Bir then() içinde normal bir değer döndürülürse sonraki then() bu değeri alır. Yeni bir Promise döndürülürse zincir, o Promise’ın sonuçlanmasını bekler. Hata fırlatılırsa kontrol en yakın catch() bölümüne geçer.

Promise ve Callback Arasındaki Fark Nedir?

Callback ve Promise, asenkron işlemlerin sonucunu yönetmek için kullanılabilir. Ancak çok sayıda iç içe callback, “callback hell” adı verilen okunması ve yönetilmesi zor bir yapı oluşturabilir.

Özellik Callback Promise
Kod yapısı İç içe fonksiyonlara dönüşebilir Zincirlenebilir
Hata yönetimi Her seviyede ayrı kontrol gerekebilir Zincirin sonunda catch kullanılabilir
Okunabilirlik Karmaşık işlemlerde azalabilir Daha düzenli bir akış sunar
Async/await uyumu Doğrudan uyumlu değildir Async/await yapısının temelidir

Async/Await ile Promise Arasındaki Fark Nedir?

async/await, Promise’a alternatif bir asenkron model değil; Promise tabanlı işlemleri daha okunabilir yazmayı sağlayan söz dizimidir. async olarak tanımlanan bir fonksiyon her zaman Promise döndürür. await ise ilgili Promise sonuçlanana kadar yalnızca içinde bulunduğu async fonksiyonun devamını bekletir.

async function kullaniciyiYukle() {
  try {
    const response = await fetch("https://api.example.com/users/1");

    if (!response.ok) {
      throw new Error(`HTTP hatası: ${response.status}`);
    }

    const kullanici = await response.json();
    console.log(kullanici);
  } catch (hata) {
    console.error("Kullanıcı yüklenemedi:", hata);
  }
}

Bu örnekte await, Promise sonucunun alınmasını kolaylaştırır; hata yönetimi ise try/catch ile yapılır.

Promise ile Fetch API Nasıl Kullanılır?

Tarayıcıdaki fetch() fonksiyonu bir Promise döndürür. Ancak önemli bir ayrıntı vardır: fetch(), 404 veya 500 gibi HTTP hata durumlarında Promise’ı otomatik olarak reddetmez. Bu nedenle response.ok ayrıca kontrol edilmelidir.

fetch("https://api.example.com/products")
  .then((response) => {
    if (!response.ok) {
      throw new Error(`HTTP hatası: ${response.status}`);
    }
    return response.json();
  })
  .then((products) => {
    console.log(products);
  })
  .catch((hata) => {
    console.error("Veri alınamadı:", hata);
  });

Promise.all() Ne İşe Yarar?

Promise.all(), birden fazla asenkron işlemi paralel başlatıp tümünün başarıyla tamamlanmasını bekler. Sonuçlar, Promise’ların tamamlanma sırasına göre değil giriş dizisindeki sıraya göre döner. Promise’lardan biri reddedilirse Promise.all() da o hatayla reddedilir.

const [kullanici, siparisler, bildirimler] = await Promise.all([
  kullaniciGetir(),
  siparisleriGetir(),
  bildirimleriGetir()
]);

Birbirinden bağımsız sonuçların tümüne ihtiyaç duyulduğunda, işlemleri sırayla beklemek yerine Promise.all() kullanmak toplam süreyi azaltabilir.

Promise.allSettled(), Promise.race() ve Promise.any()

Promise.allSettled()

Tüm Promise’ların sonuçlanmasını bekler. Bazıları başarısız olsa bile her işlemin fulfilled veya rejected durumunu ayrı ayrı döndürür. Toplu işlemlerde tüm sonuçların raporlanması gerektiğinde kullanışlıdır.

Promise.race()

İlk sonuçlanan Promise’ın sonucunu benimser. İlk sonuç başarı da hata da olabilir. Zaman aşımı senaryolarında sık kullanılır.

const timeout = new Promise((_, reject) => {
  setTimeout(() => reject(new Error("İstek zaman aşımına uğradı.")), 5000);
});

Promise.race([veriGetir(), timeout]);

Promise.any()

İlk başarıyla tamamlanan Promise’ın değerini döndürür. Bütün Promise’lar reddedilirse AggregateError ile reddedilir. Aynı veriyi birden fazla kaynaktan alma gibi alternatifli senaryolarda kullanılabilir.

Promise’lar Event Loop İçinde Nasıl Çalışır?

Promise callback’leri JavaScript event loop içinde microtask kuyruğunda çalışır. Senkron kod tamamlandıktan sonra, sıradaki normal task çalıştırılmadan önce bekleyen microtask’lar işlenir.

console.log("A");

Promise.resolve().then(() => console.log("B"));

setTimeout(() => console.log("C"), 0);

console.log("D");

Bu kodun çıktısı A, D, B, C olur. Çünkü önce senkron kod, ardından Promise microtask’ı ve son olarak zamanlayıcı görevi çalışır.

JavaScript Promise Hangi Durumlarda Kullanılır?

  • REST veya GraphQL API’lerinden veri alma
  • Dosya yükleme ve indirme
  • Veritabanı sorgularını yönetme
  • Kullanıcı kimlik doğrulama işlemleri
  • Zamanlayıcı ve gecikmeli görevler
  • Birden fazla bağımsız isteği paralel çalıştırma
  • React, Vue, Angular ve Node.js uygulamalarındaki asenkron süreçler

Promise ve asenkron JavaScript, modern frontend ve backend geliştirmede temel yetkinlikler arasındadır. İlgili kurumsal programları Angular, React ve Node.js eğitimleri sayfasında inceleyebilirsiniz.

Promise Kullanımında Sık Yapılan Hatalar

Promise Döndürmeyi Unutmak

Bir then() içindeki asenkron işlem döndürülmezse zincirin sonraki adımı bu işlemi beklemez.

Hataları Yutmak

catch() içinde hata kaydedilip işlem normal biçimde sürdürülürse sonraki adımlar zinciri başarılı zannedebilir. Gerekiyorsa hata yeniden fırlatılmalıdır.

Bağımsız İşlemleri Gereksiz Yere Sırayla Beklemek

Birbirine bağlı olmayan işlemleri art arda await etmek toplam süreyi uzatabilir. Hepsinin başarıyla tamamlanması gerekiyorsa Promise.all() değerlendirilebilir.

forEach İçinde await Kullanmak

forEach(), async callback’i beklemez. İşlemlerin paralel yürütülmesi için map() ve Promise.all(); sırayla yürütülmesi için for...of kullanılabilir.

Her İşlemi Gereksiz Yere Promise’a Çevirmek

Senkron olarak tamamlanan basit bir hesaplamayı Promise içine sarmak kodu daha iyi hale getirmez. Promise yalnızca asenkron sonucu temsil etme ihtiyacı olduğunda kullanılmalıdır.

JavaScript Promise Nasıl Öğrenilir?

Promise konusuna geçmeden önce değişkenler, fonksiyonlar, callback’ler, hata yönetimi ve JavaScript event loop mantığının öğrenilmesi faydalıdır. Ardından then, catch, Promise zinciri, async/await ve Promise birleştirme metodları gerçek API örnekleriyle çalışılmalıdır.

Promise, async/await, DOM işlemleri ve modern JavaScript uygulamalarını birlikte öğrenmek isteyen ekipler JavaScript Fundamentals Eğitimi programını inceleyebilir. HTML, CSS ve JavaScript temellerini birlikte ele alan program için Programming in HTML5 with JavaScript and CSS3 Eğitimi sayfasına bakabilirsiniz.

Modern kullanıcı arayüzü geliştirmeye devam etmek isteyenler için React ile Uygulama Geliştirme Eğitimi; tüm ilgili programlar için ise Front End Development eğitimleri değerlendirilebilir.

Sık Sorulan Sorular

JavaScript’te Promise ne demek?

Promise, gelecekte tamamlanacak asenkron bir işlemin sonucunu temsil eden nesnedir. İşlem başarıyla tamamlandığında bir değer, başarısız olduğunda ise hata nedeni üretir.

Promise ile async/await arasındaki fark nedir?

Async/await, Promise’tan farklı bir asenkron model değildir. Promise tabanlı işlemleri daha okunabilir yazmayı sağlayan söz dizimidir. Async fonksiyonlar Promise döndürür ve await bir Promise’ın sonuçlanmasını bekler.

Promise.all() ne işe yarar?

Promise.all(), birden fazla Promise’ı paralel başlatıp hepsinin başarıyla tamamlanmasını bekler. İşlemlerden biri reddedilirse Promise.all() da ilgili hatayla reddedilir.

Promise.race() ne işe yarar?

Promise.race(), verilen Promise’lar arasında ilk sonuçlananın durumunu ve değerini benimser. İlk sonuç başarı da hata da olabilir; bu nedenle zaman aşımı senaryolarında sık kullanılır.

Fetch bir Promise döndürür mü?

Evet. JavaScript fetch() fonksiyonu bir Promise döndürür. Ancak 404 ve 500 gibi HTTP hata durumlarında Promise otomatik olarak reddedilmez; response.ok veya status değeri ayrıca kontrol edilmelidir.

Promise senkron mu asenkron mu çalışır?

Promise constructor içindeki executor fonksiyonu senkron olarak çalışır. Ancak then(), catch() ve finally() callback’leri microtask kuyruğu üzerinden mevcut senkron kod tamamlandıktan sonra çalıştırılır.

Kurumsal JavaScript Eğitimi

JavaScript Promise yapılarını doğru kullanmak; API entegrasyonları, frontend uygulamaları ve Node.js tabanlı servislerde güvenilir asenkron akışlar oluşturmak açısından önemlidir. BlueMark Academy’nin kurumlara ve firmalara yönelik JavaScript eğitimleri, temel dil bilgisinden Promise, async/await ve modern uygulama geliştirme konularına kadar ekiplerin ihtiyaçlarına göre planlanabilir.

Kurumsal eğitim seçenekleri için JavaScript Fundamentals Eğitimi içeriğini inceleyebilir veya kurumunuza özel program hakkında BlueMark Academy’den bilgi alabilirsiniz.

Son güncelleme: Ağustos 2026.