主题需要 RxJS6 asObservable() 吗?

Hor*_*ley 5 javascript rxjs typescript rxjs6

什么时候asObservable()需要一个主题(例如 BehaviorSubject)来获得该主题的可观察性?主题 isself 也可以转换为 Observable。

问题

  1. name1$和之间的技术区别是name2$什么?
  2. 应该使用哪一个(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);
  }
}
Run Code Online (Sandbox Code Playgroud)

提前感谢您的回答!

Val*_*kov 7

asObservable()创建一个新的 Observable,它包装Subject,因此包装的 observable 没有next()方法,以及complete()error()。我认为这在 JavaScript 中更有意义,因为返回的对象不受其类型的限制。但在 TypeScript 中,你可以通过缩小类型来隐藏这些方法,在大多数情况下这应该足够了。您只需告知Observable返回了 an,API 的用户并不知道它是Subject; 当然它可以被转换回Subject,但这不是 API 应该使用的方式。

另请参阅:何时在 rxjs 中使用 asObservable()?


mar*_*tin 6

一般情况下,建议asObservable()仅在 JavaScript 中使用 RxJS 时使用。使用 TypeScript,你可以只使用类型转换,它不会让你打电话next()等等。

private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public nameSubject$: Observable<string> = this.nameSubject;
Run Code Online (Sandbox Code Playgroud)

这是官方推荐的在 TypeScript 中将 Subjects 转换为 Observables 的方法。
有关详细信息,请参阅https://github.com/ReactiveX/rxjs/pull/2408#issuecomment-282077506