nullDev
nullDev

Reputation: 11617

Better way to return conditional rxjs Observable

In the following code, are the functions onReady1() and onReady2() equivalent? What are the differences? Is there a better way to write this function?

The onReadyx() functions should return the user if it is available right away, or it would wait until its available. There will be multiple calls to this function at any given time.

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);
    }

}

Upvotes: 1

Views: 118

Answers (1)

Julia Passynkova
Julia Passynkova

Reputation: 17899

Use publishLast

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

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

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

Upvotes: 2

Related Questions