有条件地发出可观察的

时间:2017-08-17 11:46:48

标签: angular rxjs observable ngrx ngrx-store

我们有一个带Redux的Angular 4应用程序(ngrx 4)。

我们保留信息" isLoggedIn"在ngrx / store中,当我们发出对http的调用时,我们首先要检查他是否经过身份验证。

我们正在努力解决的问题是实现http调用的服务:

export class GetDataFromREST() {

     constructor(private http: HttpClient, private loginStore: Store) {
          this.loggedIn$ = this.loginStore.select(getLoggedIn);
     }
     ...
     public getProducts(): Observable<ProductList> {

          return /*observable that returns http.get(api) only 
                   after the loggedIn$ emits true */
     }
}

请注意,登录不应该是服务的一个问题 - 一旦登录它应该执行从它询问的所有呼叫。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这将达到您要求的结果。

export class GetDataFromREST() {

     constructor(private http: HttpClient, private loginStore: Store) {
          this.loggedIn$ = this.loginStore.select(getLoggedIn);
     }
     ...
     public getProducts(): Observable<ProductList> {

          return this.loggedIn$.filter(Boolean).take(1).subscribe(
            () => http.get(api)
          )
     }
}

答案 1 :(得分:1)

由于loggedIn$已经是一个Observable,你可以重播它的最后一个值并将其用作将与远程调用合并的源Observable:

this.loggedIn$ = this.loginStore.select(getLoggedIn)
  .publishReplay(1)
  .refCount();

...

public getProducts(): Observable<ProductList> {
  return this.loggedIn$
    .mergeMap(() => http.get(api));
}

所以getProducts()this.loginStore.select(getLoggedIn)发出之前不会发出任何内容。

同样,当您稍后致电getProducts()时,this.loggedIn$中的最新值将被重播,因此它会立即运行远程呼叫。

答案 2 :(得分:0)

使用CombineLatest运算符将log in observable与get api observable相结合,然后您可以按登录状态进行过滤

http://reactivex.io/documentation/operators/combinelatest.html http://reactivex.io/documentation/operators/filter.html