[]
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
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