2017-09-12 37 views
0

我面臨着flatMap運算符的隨機行爲,我無法找到原因。有時它觸發,有時它不...Observables:flatMap隨機未觸發

這是的情況: 用戶可以更改我的應用程序中的語言,所以我有一個行爲子語言(由選擇列表觸發)返回作爲它的提供者可以觀察到的。當有變化時,我會調用(通過flatMap)一個http請求來獲取所選語言的數據。

它看起來像這樣:

this.languageProvider.getLang$().flatMap(langCode => { 
 
    return this.http.get(`https://SERVER_URL.net/datas?lang=${langCode}`) 
 
    .map(data => data.json()) 
 
}) 
 
.subscribe(
 
    data => { 
 
    // do smth 
 
    }, 
 
    err => { 
 
    // do smth 
 
    } 
 
);

的事情是,當我改變了語言HTTP調用是最經常不會被觸發。

如果我添加一個簡單的訂閱它總是工作...

this.languageProvider.getLang$().subscribe(langCode => { 
 
    console.log(langCode); 
 
});

任何想法,爲什麼我有這個問題?

這裏是languageProvider:

import { Injectable } from '@angular/core'; 
 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 
 
import { Observable } from 'rxjs/Observable'; 
 

 
@Injectable() 
 
export class LanguageProvider { 
 
    private lang$: BehaviorSubject<string>; 
 

 
    constructor() { 
 
    this.lang$ = new BehaviorSubject('en'); 
 
    } 
 

 
    setLang(langCode: string) { 
 
    this.lang$.next(langCode); 
 
    } 
 

 
    getLang$(): Observable<string> { 
 
    return this.lang$.asObservable(); 
 
    } 
 
}

非常感謝

回答

0

OK,固定它。

這是不是隨機的實際...

在我(簡體)片斷沒寫我如何處理服務器響應。事實上,如果我試圖獲取服務器上沒有更改的數據(如果這樣做是爲了避免每次用戶啓動應用程序時都下載服務器數據),我可以收到304狀態代碼。

問題是,我有在錯誤回調中處理304,因爲角度會將299以上的所有內容視爲錯誤。

我不知道的是,錯誤回調正在殺死我的觀察。因此,僞「隨機」行爲實際上是: - 如果我試圖在不更改語言的情況下重新加載應用程序,那麼我得到了一個304,因此觀察者死亡 - 如果我在更改語言後嘗試重新加載應用程序,應用程序將獲取該語言的數據並獲得200.因此,觀察臺將繼續工作

也許這將幫助某人。 乾杯