2017-05-05 25 views
1

次のコードでは、関数onReady1()onReady2()は同等ですか?違いは何ですか?この関数を書く良い方法はありますか?条件付きrxjsを返すより良い方法Observable

ファンクション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); 
    } 

} 
+0

なぜあなたはそれをやっていますか?あなたはユーザーをキャッシュしようとしていますか? – n00dl3

+0

@ n00dl3はい。私は後続のサービス呼び出しに使用する 'IUser'のトークンを取得します。 – nullDev

+0

それから@JuliaPassynkovaの解決に向かう。 – n00dl3

答えて

2

使用publishLast

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

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

getUserObservable(): Observable< IUser> { 
    return this.sharedStream$; 
} 
} 
関連する問題