- Konu sahibi
- #1
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
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:
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
Başarılı çalışmada önce
İşlemin sonucunu bir sonraki adıma aktarmak için
İlk
Bu sürümde
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öntem | Görevi | Ne zaman kullanılır? |
|---|---|---|
.then() | Başarılı sonucu işler | İşlem başarılı olduğunda yapılacaklar için |
.catch() | Hatayı işler | Promise reddedildiğinde veya zincirde hata oluştuğunda |
.finally() | Sonuçtan bağımsız çalışır | Yü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
- Tek bir asenkron işlemin sonucunu işlemek için
.then().catch()veyaasync/awaitiletry/catchkullanın. - 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. - Promise'i yalnızca oluşturup sonucu işlememek yerine mutlaka
returnedin veyaawaitile bekleyin. - 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.
- Promise'in kendisi sonuç değil, sonucun geleceğini temsil eden nesnedir. Gerçek veriye ulaşmak için
thenveyaawaitgerekir.