Sorumluluk reddi: Redux-observable'ın yazarlarından biriyim, bu yüzden% 100 tarafsız olmak benim için zor.
Şu anda redux-observable'ın redux-saga'dan daha iyi olduğuna dair herhangi bir neden sunmuyoruz çünkü ... öyle değil. 😆
tl; dr her ikisinin de artıları ve eksileri vardır. Birçoğu birini diğerinden daha sezgisel bulacaktır, ancak RxJS'yi (yeniden gözlemlenebilir) veya üreteçleri / "veri olarak etkileri" (redux-saga) bilmiyorsanız, her ikisini de farklı şekillerde öğrenmek karmaşıktır.
Aynı sorunu son derece benzer yollarla çözerler, ancak ancak yeterince kullandığınızda gerçekten belirgin hale gelen bazı temel farklılıklara sahiptirler.
redux-observable neredeyse her şeyi deyimsel RxJS'ye erteliyor. Dolayısıyla, RxJS bilgisine sahipseniz (veya kazanıyorsanız), redux-observable'ı öğrenmek ve kullanmak çok doğaldır. Bu aynı zamanda, bu bilginin redux dışındaki şeylere aktarılabilir olduğu anlamına gelir. MobX'e geçmeye karar verirseniz, Angular2'ye geçmeye karar verirseniz, gelecekteki bir sıcaklığa X geçmeye karar verirseniz, RxJS'nin size yardımcı olma ihtimali son derece yüksektir. Bunun nedeni, RxJS'nin genel bir eşzamansız kitaplık olması ve birçok yönden kendi başına bir programlama dili gibi olmasıdır — tüm "Reaktif Programlama" paradigması. RxJS, 2012'den beri var olmuştur ve bir Rx.NET portu olarak başlamıştır (hemen hemen her ana dilde "portlar" vardır, bu kadar yararlıdır ).
redux-saga, zamana dayalı operatörlerini kendisi sağlar, bu nedenle bu süreç yöneticisi stilinde jeneratörler ve yan etkileri ele alma hakkında edindiğiniz bilgiler aktarılabilirken, gerçek operatörler ve kullanım başka herhangi bir büyük kütüphanede kullanılmaz. Yani bu biraz talihsiz bir durum, ancak kesinlikle tek başına bir anlaşma bozucu olmamalı.
Aynı zamanda "veri olarak efektler" ( burada açıklanmıştır ) kullanır, bu da ilk başta başınızı sarmak zor olabilir, ancak bu, redux-saga kodunuzun aslında yan etkileri kendi başına gerçekleştirmediği anlamına gelir. Bunun yerine, kullandığınız yardımcı işlevler, yan etkiyi yapma amacını temsil eden görevlere benzeyen nesneler oluşturur ve ardından dahili kitaplık bunu sizin için gerçekleştirir. Bu, alay etmeye gerek kalmadan testi son derece kolaylaştırır ve bazı insanlar için çok caziptir. Bununla birlikte, şahsen bunun, birim testlerinizin saga mantığınızın çoğunu yeniden uyguladığı anlamına geldiğini buldum - bu testleri çok yararlı IMO yapmaz (bu görüş herkes tarafından paylaşılmaz)
İnsanlar sık sık redux-observable ile neden böyle bir şey yapmadığımızı soruyorlar: bana göre bu, normal deyimsel Rx ile temelde uyumsuz. .debounceTime()
Rx'te, geri çevirmek için gerekli mantığı kapsayan bu tür operatörler kullanıyoruz , ancak bunun anlamı, gerçekten hata giderme işlemini gerçekleştirmeyen ve bunun yerine görev nesnelerini niyetle yayınlayan bir versiyonunu yapmak istersek, artık Rx'in gücü, çünkü artık operatörleri zincirleyemezsiniz çünkü operasyonun gerçek sonucu değil, o görev nesnesi üzerinde çalışıyor olacaklardır. Bunu zarif bir şekilde açıklamak gerçekten zor. Yaklaşımların uyumsuzluğunu anlamak için yine Rx'in iyice anlaşılmasını gerektirir. Eğer varsa gerçekten böyle bir şey istiyorum, kontrol redux-döngüleriBu, cycle.js'yi kullanan ve çoğunlukla bu hedeflere sahip. Zevklerime göre çok fazla tören gerektirdiğini düşünüyorum, ancak ilginizi çekiyorsa bir deneme yapmanızı tavsiye ederim.
ThorbenA'nın da belirttiği gibi, redux-saga'nın şu anda (10/13/16) redux için karmaşık yan etki yönetiminde açık lider olduğunu kabul etmekten çekinmiyorum. Daha önce başladı ve daha sağlam bir topluluğa sahip. Bu yüzden, bloktaki yeni çocuk yerine fiili standardı kullanmak çok cazip. Ya önceden bilgi sahibi olmadan kullanırsanız, biraz kafa karışıklığı yaşadığınızı söyleyebilirim. İkimiz de oldukça gelişmiş konseptler kullanıyoruz ve bir kez "elde ettiğinizde" karmaşık yan etki yönetimini çok daha kolay hale getiriyor, ancak o zamana kadar birçok kişi tökezliyor.
Verebileceğim en önemli tavsiye, bu kütüphanelerden herhangi birine ihtiyaç duymadan getirmemenizdir. Yalnızca basit ajax aramaları yapıyorsanız, muhtemelen onlara ihtiyacınız yoktur. redux-thunk öğrenmesi aptalca basittir ve temel bilgiler için yeterince sağlar - ancak eşzamansız ne kadar karmaşıksa, redux-thunk için o kadar zor (hatta imkansız) hale gelir. Ancak birçok yönden redux-observable / saga için, async ne kadar karmaşıksa o kadar çok parlar. Aynı projede diğerlerinden biriyle (redux-observable / saga) redux-thunk kullanmanın da büyük bir değeri var! genel basit şeyleriniz için redux-thunk ve daha sonra karmaşık şeyler için yalnızca redux-observable / saga kullanın. Bu üretken kalmanın harika bir yolu, bu yüzden redux-thunk ile önemsiz olan şeyler için redux-observable / saga ile savaşmıyorsunuz.