2017-08-17 62 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$中的最新值,以便它立即運行遠程呼叫。