2017-08-17 110 views
0

我们有Redux(ngrx 4)的Angular 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 */ 
    } 
} 

注意登录不应该是服务的一个问题 - 登录后应该执行的所有呼叫被问到它。

有什么想法?

+1

你是什么意思*“执行所有要求的来电。”*? – martin

+0

我误解了你的要求 - 为什么不只是在getProducts()方法中进行布尔检查(isLoggedIn),然后调用API或返回一个空的可观察值 –

+0

如果应用程序在调用'getProducts() IsLoggedIn'在商店中设置为“true”,呼叫不会失败(或返回空)。它应该等到该值变为“true”,然后将“http.get”返回给调用者。我希望这能澄清它? – veljkoz

回答

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) 
     ) 
    } 
} 
+0

这就需要每一个'http.get'这是以往任何时候都发出每一次店内的变化(这是相当频繁的终极版) – veljkoz

+0

当然我现在已经更新它,它只会运行一次 – Meeker

+0

尼斯之一,另外,简单!像魅力一样工作 - 谢谢! – veljkoz

1

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

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$中的最新值,以便它立即运行远程呼叫。