[]

Javascript'te promise?

Arkadaşlar bu javascript'te promise olayını biri anlatabilir mi bana? özellikle angular'da kullanırken $http.post get geriye promise dönüyor deniliyor. tam olarak nedir ve nasıl çalışır? internette de araştırdım ama net bir şeyler bulamadım. javascript uzmanları, client side'ın aslanları bir cevap verin lütfen




 
javascript artık sadece client side değil, öncelikle bunu bi yazalım. (bkz: node.js)

promise, bir fonksiyonun gelecekte return edeceği değerin şimdiki karşılığı demek. promise/A protokolü ile tanımlanır ve tek özelliği then adında bir nesne döndürür. bu then'in callback fonksiyonu atayabileceğin iki property'si vardır: resolve ve reject.

tek kullanım amacı, asenkron javascript'i senkronize etmek ve developer'ı callback hell'den kurtarmak, daha okunabilir kod üretmek.

eğer kullandığın kütüphanenin bir metodu promise return ediyor ise, kodun notasyonu şu şekilde olur:

kutuphane_metod().then(function(), function());

kutuphane_metod() ya resolve edecektir, ya da reject. eğer resolve ederse then'e gönderdiğin ilk fonksiyon çağrılır, reject ederse ikincisi. resolve veya reject ederken bu callback fonksiyonlara parametre geçebilirsin. yani kutuphane_metod içerisinde resolve(true) dersen, bu true değerini function(bool_input) şeklindeki bir fonksiyon ile yakalayabilirsin.


then nesnesine verdiğin 2 callback fonksiyonu, promise kütüphanesi tarafından thenable interface'ini implement eder. amaç bunları zincirleme kullanabilmek. bir then callback içerisindeki return değeri, sonrasındaki then'in callback fonksiyonunun input parametresi olur.


metod().then(function(x) {
return x*x;
}).then(function(y) {
console.log(y);
});

metod() içerisinde resolve(5) çağrılırsa x=5, y=25 olur.

işin en önemli yeri: sen developer olarak şundan emin olursun. then() metoduna gönderdiğin fonksiyonlar metod()'un çalışması sona ermeden başlayamacaktır. yani senkron çalışacaktır.

promise library olarak bluebird tavsiye ederim.

ek:

sen de kendi metodunu promise return edecek şekilde yapabilirsin. tüm promise library'ler buna imkan verir:

function user_id_bul() {
return new Promise(function(resolve, reject) {
... asenkron işler yap. mesela veritabanından user_id çek. ...
if (error) {
reject();
} else {
resolve(user_id);
}
}
}


kullanımı:


console.log("Arayalım");
user_id_bul('screamshot').then(function(buldugumuz_user_id) {
console.log("Bulduk : " + buldugumuz_user_id); // varsayalım 4
});
console.log("Arıyoruz";


console'da sırasıyla şunları görürsün:
Arayalım
Arıyoruz
Bulduk: 4
  • screamshot  (26.05.15 13:54:54 ~ 14:10:09) 
vaay süpersin, çok sağol. benim için baya açıklayıcı oldu bu.


  • hb  (26.05.15 14:14:21) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.