Promise Nedir?

Promise Nedir?

JavaScript'te asenkron işlemleri yönetmek için kullanılan Promise yapısı, işlem tamamlanıp tamamlanmadığını izlemek için kullanılır Promise, belirli bir işlemin sonucunu temsil eden bir nesnedir ve işlem tamamlandığında geri döndürülen veya hata durumunda döndürülmeyen bir değer olabilir Promise kullanarak, birden fazla sözleşmeyi birleştirip tek bir çözüme ulaşmak mümkündür Nodejs'te Promise kullanarak, uzun süren veri alma işlemlerini yönetmek ve kodları daha güvenli ve verimli bir şekilde yazmak mümkündür

Promise Nedir?

Promise, JavaScript programlama dili içerisinde asenkron işlemler için kullanılan bir yapıdır. Bu yapı, asenkron bir işlemin tamamlanıp tamamlanmadığını izlemek için kullanılır. Promise, belirli bir işlem sonunda gerçekleşecek bir değerin nesnesidir. Bu değer, işlem tamamlandığında geri döndürülen veya bir hata durumunda döndürülmeyen bir değer olabilir.

Promise, JavaScript programlama dilinde oldukça yaygın bir şekilde kullanılır. Promise, uzun süren işlemleri yürütmek için ideal bir yapıdır. Bununla birlikte, yeni geliştirilen JavaScript karşılıklı kaynak kodu öğrenme yöntemi olan ECMAScript 6 ile birlikte, Promise kavramı daha da geliştirilmiştir. Bu da kullanım kolaylığı sağlamaktadır.


Promise ile Birleştirme Nedir?

Promise, JavaScript tarafından sunulan bir araçtır ve kodun sürecini daha düzenli hale getirmek için kullanılır. Promise ile birleştirme işlemi, farklı sözleşmeleri birleştirerek tek bir çözüme ulaşmak için kullanılır.

Promise birleştirme işlemi, Promise.all() yöntemi kullanılarak gerçekleştirilir. Bu yöntem, birden fazla sözleşmeyi birleştirir ve bir sonuç döndürür. Dönen sonuç, tüm sözleşmelerin tamamlanmasının ardından elde edilir.

Örneğin, bir web sayfasındaki resimleri yüklemek istediğimizi varsayalım. Bu resimler farklı sunucularda barındırılabilir ve bu nedenle farklı sözleşmelerle elde edilebilir. Promise.all() yöntemi bu sözleşmeleri birleştirir ve sonucu döndürür.

Aşağıdaki tabloda, Promise ile birleştirme işleminin temsil edildiği bir örnek gösterilmektedir.

Resim Sunucu Sözleşme
Resim 1 Sunucu 1 Promise 1
Resim 2 Sunucu 2 Promise 2
Resim 3 Sunucu 3 Promise 3

Yukarıdaki örnekte, farklı sunuculardan üç farklı sözleşme kullanarak web sayfasındaki resimlerin yüklenmesi sağlanmaktadır. Bu sözleşmeler, Promise.all() yöntemi ile birleştirilir ve tek bir sonuç döndürülür.

Promise ile birleştirme işlemi, kodun daha düzenli ve okunaklı olmasını sağlar. Ayrıca, birden fazla sözleşmenin birleştirilmesi, kodun daha hızlı çalışmasına yardımcı olur. Ancak, bu yöntem doğru şekilde kullanılmadığında performans sorunlarına neden olabilir.


Node.js'te Promise Kullanımı

Node.js, JavaScript temelli bir bir arka uç platformudur. Node.js özellikleri arasında en önemlisi JavaScript kütüphanelerinin kullanımı ve Node.js çalışma zamanı yönetimi ile birlikte artan verimliliktir. Node.js'in Promise kullanımı, JavaScript kodlarınızın güvenilirliğini artırmak için gerekli olan bir özelliktir.

Promiseler, Node.js'te özellikle veri tabanı işlemleri gibi tasarım desenleri için idealdir. Promise, işlemin tamamlanması için beklemek yerine, kodunuzun işlevinin tamamlanmasını beklemeyi sağlar.

Promise objesinin kullanımı oldukça kolaydır. İşlevler return ile bir Promise nesnesi döndürebilirler ya da bir işlem tamamlandığında resolve() fonksiyonunu çağırabilirler. Bu örnekte, bir dosyanın okunmasını içeren bir Promise işlevi gösterilmektedir.

const fs = require('fs');

let okunanDosya = function(dosyaAdi) {

return new Promise(function(resolve, reject) { fs.readFile(dosyaAdi, function(err, data) { if (err) { return reject(err); } resolve(data); }); }); };

okunanDosya('ornekDosya.txt').then(function(data) { console.log(data.toString());}).catch(function(err) { console.log(err);});

Yukarıdaki örnekte, Node.js kullanılarak bir dosyanın okunması gösterilmiştir. Promise nesnesi dosyanın okunmasının tamamlanmasını bekler ve ardından aldığı veriyi döndürür.

Birden fazla Promise kullanarak zincirleme işlemi yapmak mümkündür. Bu işleme Promise Zinciri ismi verilir. Bir Promise zincirinde bir Promise'den sonra bir başka Promise çağrılır.

Örnek bir Promise zinciri şu şekilde olabilir:

const birinciPromise = new Promise(resolve => {  setTimeout(() => {    resolve('Birinci');  }, 1000);});

const ikinciPromise = new Promise(resolve => { setTimeout(() => { resolve('İkinci'); }, 2000);});

const üçüncüPromise = new Promise(resolve => { setTimeout(() => { resolve('Üçüncü'); }, 3000);});

birinciPromise.then((birinciSonuç) => { console.log(birinciSonuç); return ikinciPromise;}).then((ikinciSonuç) => { console.log(ikinciSonuç); return üçüncüPromise;}).then((üçüncüSonuç) => { console.log(üçüncüSonuç);}).catch((err) => { console.log(err);});

Node.js platformu, asenkron bir yapıya sahip olduğundan, Promise işlemleri de asenkron bir şekilde yürütülür. Promise kullanarak Node.js kodlarınızı daha güvenli ve daha verimli bir şekilde yazabilirsiniz.


Promise Örneği 1

Promise, asenkron bir şekilde çalışan işlemleri yönetmek için kullanılan bir JavaScript nesnesidir. Promise kullanarak, uzun sürecek veri alma işlemlerini yönetmek mümkündür. Aşağıdaki kod örneğinde, Promise kullanarak veri alma işlemi gerçekleştirilmektedir:

İşlem Kod
Promisify etme
const promise = require('util').promisify(someFunction);
Veri alma işlemi
promise(args)  .then((result) => {    console.log(result);  })  .catch((error) => {    console.error(error);  });

Bu örnekte, bir işlev promisify işlemi yapılmıştır. Daha sonra, bu işlev Promise ile kullanılarak veri alma işlemi gerçekleştirilmiştir. Promise kullanarak, veri alma işlemi tamamlandıktan sonra then bloğu içinde sonuçlar işlenebilir ve bir hata oluşursa catch bloğu ile hatayla ilgili işlemler yapılabilir.


Promise Zinciri Kullanımı

Promise zinciri, birden fazla Promise kullanarak zincirleme işlemi yapmak için kullanılır. Bu zincirleme işlemi, birden fazla işlem sırasında verileri düzenli bir şekilde işlemek için kullanılabilir. Zincirin başlangıç noktasında, bir Promise oluşturulur. Ardından, Promise'in then() yöntemi kullanılarak diğer Promiseler ile zincirleme işlemi gerçekleştirilir.

Örneğin, bir kullanıcının giriş yapması gerektiği bir durumda, kullanıcının kimlik doğrulama işlemi gerçekleştirmeden önce birçok aşaması vardır. Bir Promise zinciri kullanılarak, kullanıcının giriş yapması için gerekli olan tüm işlemler düzenli bir şekilde sıralanabilir. İlk Promise, kullanıcının verilerini doğrularken, ardından diğer Promiseler zincirleme olarak gerçekleştirilir. Bu zincirleme işlemi, Promise zinciri kullanılarak kolayca gerçekleştirilebilir.

Aşağıda, Promise zinciri kullanarak bir örnek verilmiştir:

Adım Görev Kod Örneği
1 İlk Promise
let firstPromise = new Promise((resolve, reject) => {    setTimeout(() => {        resolve("İlk Promise başarılı");    }, 1000);});
2 İkinci Promise
let secondPromise = firstPromise.then((result) => {    console.log(result);    return new Promise((resolve, reject) => {        setTimeout(() => {            resolve("İkinci Promise başarılı");        }, 3000);    });});
3 Üçüncü Promise
secondPromise.then((result) => {    console.log(result);    return new Promise((resolve, reject) => {        setTimeout(() => {            resolve("Üçüncü Promise başarılı");        }, 5000);    });}).then((result) => {    console.log(result);});

Yukarıdaki örnekte, ilk Promise başlatılır, sonra ikinci Promise'in then() yöntemi ile zincirleme işlemi gerçekleştirilir. Son olarak, üçüncü Promise'in then() yöntemi ile zincirleme işlemi tamamlanır. Zincirleme işlemi, tüm Promiselerin başarılı sonuçlanması durumunda çalıştırılır.


Promise Hataları ve İşleme Yöntemleri

Promise'ler çalıştıkları işlemlerde hata ile karşılaşabilirler. Bu hataların işlenmesi için ise birkaç yöntem bulunmaktadır.

Promise hatalarının işlenmesi için en yaygın kullanılan yöntem, .catch() metodu kullanmaktır. Çünkü .catch() metodu, yeni bir Promise döndürür ve hatayı işleme imkanı sağlar.

Ayrıca bir Promise zincirinde hata oluştuğunda zincirin kırılmasını engelleyen Promise.allSettled() metodu da vardır. Promise.allSettled() metodu, bütün Promise'lerin tamamlanmasını bekler ve tamamlandıklarında hataları ve sonuçları bir dizi olarak döndürür.

Promise hatalarının işlenmesinde kullanılabilen diğer bir yöntem ise .finally() metodu kullanmaktır. .finally() metodu, Promise zincirinin sonunda çalışan bir metottur ve zincirin sonunda herhangi bir hata oluşsa da oluşmasa da çalışır.

Ayrıca Promise.resolve() ve Promise.reject() metotları, direk olarak bir Promise döndürür. Promise.resolve() metodu başarılı bir sonuç döndürürken, Promise.reject() metodu bir hata fırlatır.

Tüm Promise hatalarının işlenmesinde önemli olan nokta, hatanın fırlatılması durumunda hata mesajının niteliğidir. Bu noktada hatanın türüne göre nasıl işleme alınacağı belirlenmelidir.


Promise Örneği 2

=Promise kullanarak dosya okuma işlemi yapmak oldukça faydalıdır. Bu örnekte, bir dosyayı okuyarak içeriğini görüntüleyeceğiz. Öncelikle, Node.js'de dosya işlemlerini yapmak için 'fs' modülünün yüklenmesi gerekir. Daha sonra, 'readFile' fonksiyonu kullanarak dosyayı okuruz. Bu, Promise kullanarak kodumuzu daha etkili hale getirir.

Aşağıdaki kod örneğinde, öncelikle 'fs' modülü yüklenir ve promise alınır. Daha sonra, 'readFile' metodunu kullanarak dosya okuma işlemi yapılır. 'then' metodu, işlemin başarılı olduğunda çalışır ve dosya içeriği konsola yazdırılır. 'catch' metodu ise bir hata meydana geldiğinde çalışır ve hatayı konsola yazdırır.

const fs = require('fs');const util = require('util');const readFile = util.promisify(fs.readFile);

readFile('./example.txt') .then((data) => { console.log(data.toString()); }) .catch((error) => { console.error(error); });

Yukarıdaki kod, 'example.txt' dosyasını okur ve Promise kullanarak işlemleri gerçekleştirir. 'util.promisify' metodunu kullanarak 'fs.readFile' metodunu Promise haline getiririz. Ardından, 'then' ve 'catch' metodlarını kullanarak işlemleri gerçekleştiririz. Bu örnek, dosya okuma işleminin Promise kullanarak nasıl yapılabileceğini gösterir ve kodun daha düzenli, okunaklı hale gelmesini sağlar.


Promise ve Async/Await Arasındaki Farklar

Promise ve Async/Await, JavaScript programlama dilinde asenkron işlemleri yönetmek için kullanılan iki farklı yöntemdir. Promise, JavaScript'te uzun süre önce kullanılan bir yöntemken, Async/Await ECMAScript 2017 sürümü ile birlikte tanıtılmıştır. Bu nedenle, Async/Await'in daha yeni bir yöntem olduğunu söyleyebiliriz.

Promise ve Async/Await arasındaki en büyük fark, kodun okunabilirliği ve yönetilebilirliğidir. Promise yöntemi, bir dizi bağlantılı ve sıralı asenkron işlemleri yönetmek için kullanılır. Bu sayede, Promise zincirleri oluşturulabilir ve işlem sırası belirlenebilir. Diğer yandan, Async/Await yöntemi, Promise zincirlerine benzer şekilde çalışır, ancak Promise zincirlerini daha okunaklı hale getirir. Async/Await, Promise zincirlerinin sağladığı tüm avantajları korur, ancak daha açık ve okunaklı bir şekilde kod yazmayı sağlar.

Promise ve Async/Await yöntemleri arasında bir seçim yaparken, iki yöntem de güvenilir ve hızlıdır. Ancak, Async/Await'in kodun okunabilirliğini artırdığı unutulmamalıdır. Promise yöntemini daha önce kullandıysanız, Async/Await yöntemini de öğrenerek işlerinizi kolaylaştırabilirsiniz. Ayrıca, Async/Await yöntemi ile hata ayıklama sırasında da daha az hata yapabilirsiniz.

  • Promiseler kötü durumları işleyebilir ve hata yönetimi oldukça kolaydır.
  • Async / Await, Promisleri daha okunaklı ve yazmak ve okumak daha kolay hale getirerek, kodlarımızdaki hata olasılığını azaltır.
  • Promiselerin benzersiz bir avantajı, birden fazla zincirli asenkron işlemi yönetebilmeleridir ve bu sayede kodumuz daha temiz ve düzenlidir.
  • Async / Await, Promiselerin özünde bulunan şeyleri yalnızca daha okunaklı hale getirerek işlemlerimizi yönetir.
  • Promiseler, geleneksel geri çağrı yöntemiyle karşılaştırıldığında, koddaki düzeni ve okunabilirliği büyük ölçüde artırabilir.

Özet olarak, Promise ve Async/Await yöntemleri arasında bir seçim yaparken, kodun okunabilirliği ve yönetilebilirliği önemlidir. Promise yöntemi, bir dizi bağlantılı ve sıralı asenkron işlemleri yönetmek için kullanılır. Ancak, Async/Await yöntemi, daha açık ve okunaklı bir şekilde kod yazmayı ve asenkron işlemleri yönetmeyi sağlar. Bu nedenle, Async/Await yöntemini öğrenerek işlerinizi daha kolay hale getirebilirsiniz.


Async/Await Örneği

Async/Await, Promise gibi JavaScript'te kullanılan bir diğer asenkron programlama yöntemidir. Async fonksiyonu, fonksiyonun asenkron işlemi tamamlanana kadar duraklatarak, işlem tamamlanınca devam etmesini sağlar. Await ise bu işlemi bekleten özelliğin kendisidir.

Async/Await kullanarak bir veritabanından veri alma işlemi yapabileceğimiz kod örneğine göz atalım:

Kod Örneği
      async function getData() {  try {    const response = await fetch('https://example.com/api/data');    const data = await response.json();    console.log(data);  } catch (error) {    console.error(error);  }} 

Yukarıdaki kod örneğinde, async fonksiyonu veri alma işlemi için kullanılır. Fonksiyon içinde kullanılan await ifadesi, verinin geldiğini bekler. Veri geldikten sonra ise fonksiyon devam ederek, veriyi kullanır.

Bununla birlikte, hata işleme özelliği de Promise'de olduğu gibi burada da kullanılabilir. Hata yakalama, try-catch blokları aracılığıyla gerçekleştirilir.

Async/Await yöntemi, Promise'e kıyasla daha okunaklı bir kod yazımı sağlar. Bunun yanı sıra, Promiselere kıyasla hatayı daha doğru bir şekilde yakalar ve işler. Ancak, Promise'lere kıyasla performans açısından bir miktar daha yavaş çalışabilir.


Async/Await Hataları ve İşleme Yöntemleri

Async/Await kullanırken bazı hatalar ortaya çıkabilir ve bu hataların doğru bir şekilde işlenmesi önemlidir. Hataların çoğu, Promise hataları ile benzerdir, ancak bazı farklılıklar da vardır.

Birinci tür hata Promise'in reddedilmesidir. Bu durumda, kullanıcıya bir hata iletisi göstermek ve ayrıntılı bilgi sağlamak önemlidir. Bunun için try-catch blokları kullanılabilir ve hatanın nedenini tespit etmek için konsola yazdırılabilir.

İkinci tür hata, fonksiyonların içinde hataların fırlatılmasıdır. Bu sorunu çözmek için try-catch bloğu ile hatanın yakalanması ve uygun şekilde işlenmesi gerekir. Ayrıca, kodun içinde kritik hesaplamalar yaparken hata durumlarının oluşması mümkündür. Bu durumda, kullanıcıya hatanın ciddiyeti hakkında bilgi vermek çok önemlidir.

Async/Await hatalarının işlenmesinde bir diğer yöntem ise Promise zincirinin yanı sıra finally bloğunun kullanılmasıdır. finally bloğu, kodda istisna durumu olsa da, olaylar zincirinin tümünün tamamlanmasından sonra çalıştırılacaktır. Bu, programcının hata işleme yöntemlerini derinleştirmesine ve koda daha hassas bir yaklaşım benimsemesine olanak sağlar.

Son olarak, Async/Await hataları ile mücadele etmek için catch bloğundaki hata mesajlarını mümkün olduğunca ayrıntılı hale getirmek önemlidir. Hata gösterimi yapılırken bunların istenilen şekilde olması, kod karmaşıklığını azaltacak ve hatanın nedenini daha kolay bir şekilde anlamamızı sağlayacaktır.

Async/Await hatalarının doğru bir şekilde işlenmesi, programcının uygulamasının verimli ve etkili bir şekilde çalışmasını sağlayacaktır.


Promise'in Avantajları

Promise kullanmanın birçok avantajı vardır. Bunlardan bazıları şunlardır:

  • Kodun Okunabilirliği Artar: Promise kullanarak asenkron fonksiyonlarınızı daha anlaşılır ve okunaklı hale getirebilirsiniz. Promise zinciri, adım adım işlem yapmaya olanak sağlar.
  • Hata Yakalama Kolaylaşır: Promise, hata yakalamayı kolaylaştırır ve kodun daha güvenli hale gelmesini sağlar. Hata durumunda, catch bloğu kullanılarak hata işleme yapılabilir.
  • Kod Tekrarları Engellenir: Promise, callback fonksiyonların aksine tekrar kullanılabilirliği kolaylaştırır ve kodların yeniden kullanılmasını sağlar. Bu, kodun daha kısa olmasına ve daha az hata yapmaya olanak tanır.

Ayrıca Promise, daha az karmaşık kod yazmanıza ve daha az bağımlılık oluşturmanıza da olanak sağlar. Örneğin, fetch() ile bir API'den veri çekildiğinde, Promise kullanarak sonucu işleyebilir ve dönen değeri güzelce gösterebilirsiniz.

Aşağıdaki örnek, Promise kullanarak fetch() metodunu kullanarak bir API'den veri almayı gösterir.

Metod Açıklama
fetch(url) Bir URL'ye HTTP talebi gönderir ve sonucu döndürür.
.then(response => {}) Geri dönüş değerinin işlenmesini sağlar.
.then(data => {}) Veri işleme kodunu yürütür.
.catch(error => {}) Hata yakalamaya olanak sağlar.

Yukarıdaki örnek, Promise kullanarak HTTP talebinin sonucunu işleyen kod örneğidir. Promise kullanmanın avantajlarından biri, kodu okunabilir ve anlaşılır hale getirme yeteneğidir.