Evet, Vaatler zaman uyumsuz geri çağrılardır. Geri aramaların yapamayacağı hiçbir şey yapamazlar ve düz geri aramalarda olduğu gibi eşzamansızlıkla aynı sorunlarla karşılaşırsınız.
Ancak, Vaatler geri aramalardan daha fazlasıdır. Onlar çok güçlü bir soyutlama, daha az hata eğilimli kazan plakası ile daha temiz ve daha iyi, fonksiyonel kod sağlar.
Peki ana fikir nedir?
Vaatler, tek (asenkron) hesaplamanın sonucunu temsil eden nesnelerdir. Bu sonuca sadece bir kez karar verirler . Bunun ne anlama geldiği birkaç şey var:
Bir gözlemci modeli uygulamak vaat ediyor:
- Görev tamamlanmadan önce değeri kullanacak geri çağrıları bilmenize gerek yoktur.
- Geri aramalarınızı işlevlerinize bağımsız değişken olarak beklemek yerine, kolayca
return
bir Promise nesnesi
- Söz değeri saklar ve istediğiniz zaman şeffaf bir geri arama ekleyebilirsiniz. Sonuç mevcut olduğunda çağrılacaktır. "Şeffaflık", bir söz verdiğinizde ve ona bir geri arama eklediğinizde, sonucun henüz gelip gelmediği kodunuzda bir fark yaratmadığını gösterir - API ve sözleşmeler aynıdır, önbelleğe alma / notlamayı çok basitleştirir.
- Kolayca birden fazla geri arama ekleyebilirsiniz
Vaatler chainable olan ( monadic , isterseniz ):
- Eğer bir söz temsil ettiğini değerini dönüştürmek için gerekiyorsa, harita bir söz üzerinde işlev dönüşümü ve dönüştürülmüş sonucu temsil eden yeni bir söz geri almak. Bir şekilde kullanmak için değeri eşzamanlı olarak alamazsınız, ancak söz verilen bağlamda dönüşümü kolayca kaldırabilirsiniz . Ortak plaka geri araması yok.
- İki eşzamansız görevi zincirlemek istiyorsanız,
.then()
yöntemi kullanabilirsiniz . İlk sonuçla birlikte çağrılacak bir geri çağırma gerekir ve geri çağrının geri döneceği vaadinin sonucu için bir söz verir.
Kulağa karmaşık mı geliyor? Kod örneği zamanı.
var p1 = api1(); // returning a promise
var p3 = p1.then(function(api1Result) {
var p2 = api2(); // returning a promise
return p2; // The result of p2 …
}); // … becomes the result of p3
// So it does not make a difference whether you write
api1().then(function(api1Result) {
return api2().then(console.log)
})
// or the flattened version
api1().then(function(api1Result) {
return api2();
}).then(console.log)
Düzleştirme sihirli bir şekilde gelmez, ancak kolayca yapabilirsiniz. Çok iç içe geçmiş örneğiniz için, (yakın) eşdeğeri
api1().then(api2).then(api3).then(/* do-work-callback */);
Bu yöntemlerin kodunu görmek anlamaya yardımcı oluyorsa, birkaç satırda en temel vaat lib .
Vaatlerle ilgili büyük yaygara nedir?
Promise soyutlaması, işlevlerin çok daha iyi birleştirilebilirliğine izin verir. Örneğin, then
zincirlemenin yanında , all
işlev çoklu paralel bekleme vaatlerinin birleşik sonucu için bir vaat oluşturur.
Son fakat en az değil, Sözler entegre hata işleme ile birlikte gelir. Hesaplamanın sonucu, ya vaadin bir değerle yerine getirilmesi ya da bir sebeple reddedilmesi olabilir . Tüm kompozisyon işlevleri bunu otomatik olarak ele alır ve vaat zincirlerindeki hataları yayar, böylece düz geri çağrı uygulamasının aksine, her yerde açıkça ilgilenmeniz gerekmez. Sonunda, meydana gelen tüm istisnalar için özel bir hata geri çağrısı ekleyebilirsiniz.
Bazı şeyleri vaatlere dönüştürmekten bahsetmiyorum bile.
Bu aslında iyi vaat kütüphaneleri ile oldukça önemsiz, bkz. Mevcut bir geri arama API'sini vaatlere nasıl dönüştürebilirim?