Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
JavaScript Promise, henüz tamamlanmamış bir işlemin ileride başarılı bir sonuç veya hata üreteceğini temsil eden nesnedir. Özellikle ağ isteği veya dosya okuma gibi asenkron işlemlerin sonucunu düzenli biçimde ele almak için kullanılır. Promise kullanmak tek başına ağır senkron kodun ana iş parçacığını durdurmasını engellemez. Bir Promise pending durumunda başlar; işlem başarılı olursa fulfilled, başarısız olursa rejected olur.

Promise nasıl çalışır?​


new Promise içine verilen executor fonksiyonu senkron olarak hemen çağrılır; örnekte zamanlayıcıyı o başlatır. resolve normal bir değerle başarıya, reject hataya yönlendirir. Başka bir Promise ile resolve edilirse dış Promise onun sonucunu benimseyebilir; resolve çağrısı her zaman o anda fulfilled oldu demek değildir. Promise bir kez sonuçlandıktan sonra tekrar başka bir sonuca geçirilemez.

Sonucu işlemek için genellikle şu yöntemler kullanılır:

Çalıştırılabilir Promise örneği​


Aşağıdaki örnek tarayıcı konsolunda veya Node.js ortamında doğrudan çalıştırılabilir. Gerçek bir sunucuya bağlanmak yerine, gecikmeli bir işlemi temsil etmek için setTimeout kullanır.

Kod:
function kullaniciGetir(basarili = true) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (basarili) {
        resolve({ id: 1, ad: "Ada" });
      } else {
        reject(new Error("Kullanıcı alınamadı"));
      }
    }, 300);
  });
}

console.log("İstek başladı");

kullaniciGetir()
  .then((kullanici) => {
    console.log("Kullanıcı:", kullanici.ad);
  })
  .catch((hata) => {
    console.error("Hata:", hata.message);
  })
  .finally(() => {
    console.log("İşlem tamamlandı");
  });

Başarılı çalışmada önce İstek başladı, kısa bir gecikmeden sonra Kullanıcı: Ada ve İşlem tamamlandı çıktıları görülür. Hata yolunu denemek için çağrıyı kullaniciGetir(false) şeklinde değiştirin. Bu durumda .catch() hata mesajını, .finally() ise son işlem mesajını yazdırır.

İşlemin sonucunu bir sonraki adıma aktarmak için .then() içinden yeni değeri veya yeni Promise'i return edin:

Kod:
kullaniciGetir()
  .then((kullanici) => {
    return kullanici.ad;
  })
  .then((ad) => {
    console.log(ad);
  })
  .catch((hata) => {
    console.error(hata.message);
  });

İlk .then() içindeki değer döndürülmezse sonraki .then() beklenen veriyi alamaz. Bu, Promise zincirlerinde sık görülen hatalardan biridir.

YöntemGöreviNe zaman kullanılır?
.then()Başarılı sonucu işlerİşlem başarılı olduğunda yapılacaklar için
.catch()Hatayı işlerPromise reddedildiğinde veya zincirde hata oluştuğunda
.finally()Sonuçtan bağımsız çalışırYükleniyor göstergesini kapatmak gibi ortak temizlik işlemleri için


async ve await ile kullanım​


async/await, Promise kullanımını daha okunabilir bir sözdizimiyle yazmayı sağlar. Bu örnekte await bir async fonksiyon içinde kullanılır; JavaScript modülleri üst seviyede await kullanımına da izin verir. Await sıradan değerleri de kabul eder.

Kod:
async function kullaniciyiGoster() {
  try {
    const kullanici = await kullaniciGetir();
    console.log("Kullanıcı:", kullanici.ad);
  } catch (hata) {
    console.error("Hata:", hata.message);
  } finally {
    console.log("İşlem tamamlandı");
  }
}

kullaniciyiGoster();

Bu sürümde try/catch Promise'in başarı ve hata yollarını, finally ise ortak son işlemi yönetir. await yazmak işlemi engelleyen bir bekleme oluşturmaz; yalnızca ilgili async fonksiyonun devamını Promise sonuçlanana kadar erteler.

Pratik kararlar ve yaygın hatalar​


  1. Tek bir asenkron işlemin sonucunu işlemek için .then().catch() veya async/await ile try/catch kullanın.
  2. Birden fazla bağımsız işlemi birlikte beklemek için Promise.all() kullanın. İçlerinden biri reddedilirse birleşik Promise reddedilir; bu diğer işlemleri kendiliğinden iptal etmez.
  3. Promise'i yalnızca oluşturup sonucu işlememek yerine mutlaka return edin veya await ile bekleyin.
  4. Hata yakalamayı atlamayın. Yakalanmayan rejection, hatanın doğru yerde raporlanmasını ve kullanıcıya anlamlı geri bildirim verilmesini zorlaştırır.
  5. Promise'in kendisi sonuç değil, sonucun geleceğini temsil eden nesnedir. Gerçek veriye ulaşmak için then veya await gerekir.

Sık sorulan sorular​

Promise’i iptal etmek için standart bir cancel metodu var mı?​

Promise’in kendi genel cancel metodu yoktur. İptal, alttaki işlemin desteğine bağlıdır. Örneğin fetch için AbortController kullanılabilir. Yalnız sonucu artık dinlememek ağ isteğinin veya başka bir işin durduğunu göstermez.

Promise.all hata verirse diğer işler de durur mu?​

Hayır. Birleşik Promise ilk reddedilmede hata yoluna geçse de önceden başlayan diğer işler sürüyor olabilir. Her birinin sonucunu toplamak gerekiyorsa Promise.allSettled değerlendirilebilir. Gerçek iptal gerekiyorsa ilgili işlemlerin iptal mekanizmasını ayrıca yönetin.

Zaten tamamlanmış Promise’e then eklersem hemen senkron çalışır mı?​

Hayır. Then ile eklenen işleyici mevcut senkron kodun arasına girmez; sonraki mikro görev aşamasında çalışır. Bu yüzden Promise çözülmüş olsa bile sonuç işleme sırasını doğrudan normal fonksiyon çağrısıyla aynı kabul etmeyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.