javascript - Bir Subject üzerinde RxJS6 asObservable() gerekli mi?
asObservable(), bir Subject'in (örneğin BehaviorSubject) gözlemlenebilir bir versiyonunu almak için ne zaman gereklidir? Subject'in kendisi de bir Observable olarak dönüştürülebilir.
Sorular
name1$ilename2$arasındaki teknik farklar nelerdir?- Hangi kullanılmalı (
name1$yoksaname2$)?
Kod Örneği
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs';
export class Person {
private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public get name1$(): Observable<string> {
return this.nameSubject.asObservable();
}
public get name2$(): Observable<string> {
return this.nameSubject;
}
public setName(value: string): void {
this.nameSubject.next(value);
}
}
Şimdiden cevaplarınız için teşekkür ederim!
Cevap #1
Genel olarak, sadece JavaScript'te RxJS kullanırken asObservable() kullanılması önerilir. TypeScript ile sadece tip dönüşümü kullanabilirsiniz ve bu size next() vb. çağrılarını yapma izni vermez.
private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public nameSubject$: Observable<string> = this.nameSubject;
Bu, TypeScript'te Konuları (Subjects) Gözlemlenebilir (Observables) hale getirmenin resmi olarak önerilen yoludur.
Detaylar için https://github.com/ReactiveX/rxjs/pull/2408#issuecomment-282077506 adresine bakın.
Cevap #2
asObservable() yeni bir Observable oluşturur ve bu, Subject'i sarar, bu yüzden sarılmış observable'ın next() metodu olmadığı gibi complete() ve error() metodları da yoktur. Bunun JavaScript'te daha mantıklı olduğunu düşünüyorum; çünkü döndürülen nesne türü tarafından kısıtlanmamıştır. Ama TypeScript'te bu metodları sadece türü daraltarak gizleyebilirsiniz, bu çoğu durumda yeterli olmalıdır. Sadece bir Observable döndürüldüğünü söylersiniz ve API kullanıcısı bunun bir Subject olduğunu bilmez; tabii ki tekrar Subject'e dönüştürülebilir, ama bir API'nin kullanılma şekli bu olmamalıdır.
Ayrıca bakınız: rxjs'te asObservable() ne zaman kullanılır?
