Geçen hafta başka bir topluluk üyesiyle şu konu hakkında bir tartışma başlattığım bir RxJS sorusunu yanıtladım : "Belirli her yan etki için bir abonelik oluşturmalı mıyım yoksa genel olarak abonelikleri en aza indirmeli miyim?" Tam reaktif uygulama yaklaşımı veya ne zaman birinden diğerine geçilmesi için hangi yöntemin kullanılacağını bilmek istiyorum. Bu bana ve belki de başkalarına gereksiz tartışmalardan kaçınmak için yardımcı olacaktır.
Kurulum bilgileri
- Tüm örnekler TypeScript'te
- Soruya daha iyi odaklanmak için, abonelikler için yaşam döngüsü / kurucu kullanımı ve ilgisiz çerçevede tutma
- Hayal edin: Abonelikler yapıcı / yaşam döngüsü başlığına eklenir
- Hayal edin: Aboneliği iptal etmek yaşam döngüsü yok etme işleminde yapılır
Yan etki nedir (Açısal örnek)
- Kullanıcı arayüzünde Güncelleme / Giriş (ör.
value$ | async
) - Bir bileşenin çıkışı / Akışı (ör.
@Output event = event$
) - Farklı hiyerarşilerdeki farklı hizmetler arasındaki etkileşim
Örnek kullanım alanı:
- İki fonksiyon:
foo: () => void; bar: (arg: any) => void
- İki kaynak gözlemlenebilir:
http$: Observable<any>; click$: Observable<void>
foo
http$
yayıldıktan sonra değere ihtiyaç duyulurbar
click$
yayıldıktan sonra çağrılır , ancak şu anki değeri gerekirhttp$
Durum: Her belirli yan etki için bir abonelik oluşturun
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
Vaka: Genel olarak abonelikleri en aza indirin
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
Kısacası kendi fikrim
Aboneliklerin ilk başta Rx manzaralarını daha karmaşık hale getirdiği gerçeğini anlayabiliyorum, çünkü abonelerin boruyu nasıl etkilemesi veya etkilememesi gerektiğini düşünmeniz gerekiyor (gözlemlenebilir veya paylaşılmaz). Ancak kodunuzu ne kadar çok ayırırsanız (o kadar fazla odaklanırsınız: ne zaman olur) gelecekte kodunuzu korumak (test, hata ayıklama, güncelleme) o kadar kolay olur. Bunu göz önünde bulundurarak, kodumdaki herhangi bir yan etki için her zaman tek bir gözlemlenebilir kaynak ve tek bir abonelik oluşturuyorum. Eğer sahip olduğum iki veya daha fazla yan etki aynı gözlemlenebilir kaynak tarafından tetiklenirse, gözlemlenebilir durumumu paylaşırım ve her bir yan etki için ayrı ayrı abone olurum, çünkü farklı yaşam döngüleri olabilir.