Reputation: 11617
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
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