【问题标题】:Better way to return conditional rxjs Observable返回条件 rxjs Observable 的更好方法
【发布时间】:2017-05-05 11:01:08
【问题描述】:

在以下代码中,函数onReady1()onReady2() 是否等效?有什么区别?有没有更好的方法来编写这个函数?

onReadyx() 函数应该在用户立即可用时返回用户,否则它会等到用户可用。在任何给定时间都会多次调用此函数。

export class UserService {
    private _user: IUser;

    private userObservable: Observable<IUser>;

    constructor(private http: Http) {
        this.userObservable = this.getCurrentUser();
    }

    public onReady1() {
        return Observable.create((observer: Observer<IUser>) => {
            if (this._user) {
                observer.next(this._user);
                observer.complete();
                return;
            }

            this.userObservable.subscribe(user => {
                this._user = user;
                observer.next(user);
                observer.complete();
            });
        });
    }

    public onReady2() {
        return Observable.defer(() => {
            if (this._user) {
                return Observable.of(this._user);
            }

            return this.userObservable.do(user => this._user = user);
        });
    }

    private getCurrentUser() {
        return this.http.get('/currentuser')
            .map(response => response.json() as IUser);
    }

}

【问题讨论】:

  • 你为什么要这样做?您是否要缓存用户?
  • @n00dl3 是的。我在IUser 中获得了一个令牌,我想将其用于后续服务调用。
  • 然后去@JuliaPassynkova 的解决方案。

标签: typescript rxjs rxjs5


【解决方案1】:

使用 publishLast

export class Service {
  private sharedStream$: Observable< IUser>;

 constructor(public http: AuthHttp) {
   this.sharedStream$ = this. getCurrentUser()
    .publishLast()
    .refCount();
 }

 getUserObservable(): Observable< IUser> {
  return this.sharedStream$;
 }
}

【讨论】:

    猜你喜欢
    • 2019-10-26
    • 2020-07-16
    • 2019-08-05
    • 1970-01-01
    • 2017-12-28
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多