Subject 需要 RxJS6 asObservable() 吗?
RxJS6 asObservable() needed on a Subject?
Subject(例如 BehaviorSubject)什么时候需要 asObservable()
才能获得该主题的可观察值?主题本身也可以转换为 Observable。
问题
name1$
和 name2$
之间的技术差异是什么?
- 应该使用哪一个(
name1$
或 name2$
)?
代码示例
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);
}
}
提前感谢您的回答!
没有太大区别,与asObservable()
主要只是阻止你访问观察者方法——complete
、next
、error
以防止你不小心调用他们
const a = new Subject();
console.log(a.asObservable().next)
// undefined
最好 return asObservable()
为了安全起见,如果您不使用该特定流作为观察者
asObservable()
创建了一个新的 Observable,它包装了 Subject
,所以包装的 observable 没有 next()
方法,以及 complete()
和 error()
。我认为它在 JavaScript 中更有意义,其中返回的对象不受其类型的限制。但是在 TypeScript 中,你可以通过缩小类型来隐藏这些方法,在大多数情况下应该足够了。您只是告诉我们返回了一个 Observable
而 API 的用户不知道它是一个 Subject
;当然它可以转换回 Subject
,但这不是应该使用 API 的方式。
另请参阅:
一般情况下,建议只在JavaScript中使用RxJS时才使用asObservable()
。使用 TypeScript,您可以只使用类型转换,它不会让您调用 next()
等等。
private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public nameSubject$: Observable<string> = this.nameSubject;
这是在 TypeScript 中将 Subjects 转换为 Observables 的官方推荐方式。
有关详细信息,请参阅 https://github.com/ReactiveX/rxjs/pull/2408#issuecomment-282077506。
Subject(例如 BehaviorSubject)什么时候需要 asObservable()
才能获得该主题的可观察值?主题本身也可以转换为 Observable。
问题
name1$
和name2$
之间的技术差异是什么?- 应该使用哪一个(
name1$
或name2$
)?
代码示例
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);
}
}
提前感谢您的回答!
没有太大区别,与asObservable()
主要只是阻止你访问观察者方法——complete
、next
、error
以防止你不小心调用他们
const a = new Subject();
console.log(a.asObservable().next)
// undefined
最好 return asObservable()
为了安全起见,如果您不使用该特定流作为观察者
asObservable()
创建了一个新的 Observable,它包装了 Subject
,所以包装的 observable 没有 next()
方法,以及 complete()
和 error()
。我认为它在 JavaScript 中更有意义,其中返回的对象不受其类型的限制。但是在 TypeScript 中,你可以通过缩小类型来隐藏这些方法,在大多数情况下应该足够了。您只是告诉我们返回了一个 Observable
而 API 的用户不知道它是一个 Subject
;当然它可以转换回 Subject
,但这不是应该使用 API 的方式。
另请参阅:
一般情况下,建议只在JavaScript中使用RxJS时才使用asObservable()
。使用 TypeScript,您可以只使用类型转换,它不会让您调用 next()
等等。
private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public nameSubject$: Observable<string> = this.nameSubject;
这是在 TypeScript 中将 Subjects 转换为 Observables 的官方推荐方式。
有关详细信息,请参阅 https://github.com/ReactiveX/rxjs/pull/2408#issuecomment-282077506。