Onur Dayıbaşı

CV
none

Promise Nedir ?

Önceden Callback, Callback Hell çözmek için Async Kütüphanesi ve EventEmitter Observer örüntüsünden bahsetmiştim. Aslında burda da aynı sorun çözmeye çalışıyoruz. Birden fazla birbiri ardına asenkron işlemleri (Ajax, animasyon vb..) kodun okunabilirliğini bozmadan nasıl gerçekleştirebiliriz ? Bunları JQuery 1.8 den alınmış bir kaç örnek ile açıklamak istiyorum.

Yığın (Stacked): Aynı request birden fazla event handler eklemek istediğimizde.

1const request = $.ajax(url);
2request.done(()=>console.log('Request completed'));
3request.done((retrievedData) => {
4 $('#contentPlaceholder').html(retrievedData);});

Paralel Görevler(Parallel Tasks): Birden fazla asenkron işlemin hepsinin tamamlanmasından sonra işlemlerini gerçekleştirmek istiyorsanız.

1$.when(taskOne, taskTwo).done(()=>{console.log('taskOne and taskTwo are finished');});

Sıralı Görevler(Sequential Tasks): Asenkron işlemlerin sıralı(sequential) olarak işletilmesini gerçekleştirir. then sonrasında işlem başarılı bir şekilde resolved veya rejected olup olmama durumuna göre ilerletilir.

1let step1, step2;
2const url='http://fiddle.jshell.net';
3step1 = $.ajax(url);
4step2 = step1.then((data)=>{
5 let def = new $.Deferred();
6 setTimeout( ()=>{console.log('Request completed');
7 def.resolve();},2000);
8 return def.promise(); },
9 (err)=>{console.log('Step1 failed: Ajax request');});

Aslında concurrent(eş zamanlı) programlamada oluşan bu problemleri gidermek için ortaya future, promise, delay, and deferred gibi kavramlar 1976 — 1977 yıllarında ortaya atılmıştır. (Wikipedia)

  • Promise Kavramı (Daniel P. Friedman and David Wise and Peter Hibbard)
  • Future Kavramı (Henry Baker and Carl Hewitt)

Asenkron çalışmaya başladığında gelecekte işlemin nasıl işletileceği ve sonucunun nasıl sonuçlanacağını bilemeyiz.

  • promise gelecekteki bilinmeyen değeri temsil eder.
  • deferred çalışması sonlanmamış devam eden işi temsil eder.

Her bir deferred için bir promise bulunmaktadır. Promise fonksiyonları (future) değerine erişim için proxy görevi gerçekleştirir. JQuery yapısında İşlem gerçekleştiğinde işlem çözümleyicisi $.Deferred nesnesinin resolved/rejected fonksiyonları çağrılarak Promise Nesnesini işlem çözümleyicisinden ayrılmasını sağlar. Promise bize gelecek ile sunulan bir tekliftir. Ve bu teklifin özellikleri (API ve davranış özellikleri) aşağıdaki gibi olmalıdır.

3 state(durumdan) birinde olabilir

1Fulfilled: Ne zamanki işlem başarılı bir şekilde gerçekleşmiş resolved()
2
3Rejected/Failed: Ne zamanki işlem başarız bir şekilde gerçekleşmiş rejected()
4
5Pending/Unfilled: işlem devam etmekte
  • promise.then her zaman başka bir promise nesnesi dönmelidir. Böylece thenable yapılarla then(bundan sonra) zincirleri oluşturulabilir. then(onResolveHandler, onRejectHandler) fonksiyonu içerisine dönen sonuçlar yakalanır.

  • then(onResolveHandler, onRejectHandler) fonksiyonu içerisine dönen sonuçlar yakalanır.

Promise State Değişimleri

  • Promise yan efektlerden etkilenmemesi (avoid side effects)için değeri değiştirilemez veya Promise birden fazla değişkene atanamaz. Immutable ’dır. (Bu konunun biraz daha derinlerine inmek için Oguz Kılıç’ın Javascriptte Değişmezlik) yazısını okumanızı öneririm.

Sonuçta ES6 Öncesinde Promise kavramı farklı farklı kütüphanelerde ele alınıyordu. Bu spec (Promises/A Proposal & Promises/A+ Spec) sayfalarında bulabilirsiniz. Buna göre geliştirilmiş kütüphanelerden bazıları (When.js, Q.js, RSVP, jQuery)’dır

Referanslar