2017-09-12 14 views
0

flatMap 연산자에서 임의의 동작이 발생하고 그 이유를 찾을 수 없습니다. 경우에 따라 트리거됩니다 ...관찰 대상 : flatMap이 임의로 트리거되지 않음

여기에 상황이 있습니다 : 사용자가 내 앱에서 언어를 변경할 수 있으므로 언어에서 선택 목록에 의해 트리거 된 BehaviorSubject가 반환되었습니다. 공급자가 관찰 할 수 있습니다. 변경 사항이있을 때 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); 
 
});

어떤 생각

나는이 문제를 왜 ... 항상 작동 가입 한 추가하면?

답변

0

OK

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(); 
 
    } 
 
}

고마워, 그것을 고정 : 여기

는 languageProvider입니다.

그것은에서

... 실제로 임의 아니었다 내 (간체) 내가 서버 응답을 처리하는 방법을 쓰지 않았어요 니펫을. 실제로 서버에서 변경되지 않은 데이터를 가져 오려고하면 304 STATUS CODE를받을 수 있습니다. 사용자가 앱을 시작할 때마다 서버 데이터를 다운로드하지 않도록하기 위해이 작업을 수행하고 있습니다.

THE THING IS angular는 299를 초과하는 모든 것을 오류로 처리하기 때문에 오류 콜백에서 304를 처리합니다.

내가 알지 못했지만 오류 콜백이 내 관찰 가능 항목을 죽이고 있다는 것이 었습니다. 따라서 의사 랜덤 동작은 실제로는 다음과 같습니다. - 언어를 변경하지 않고 앱을 다시로드하려고 시도하면 304가 표시되므로 관찰 가능 항목이 사라졌습니다. - 언어를 변경 한 후 앱을 다시로드하려고 시도하면 응용 프로그램은이 언어에 대한 데이터를 가져 와서 200을 얻습니다. 따라서 관찰이 계속 작동합니다.

아마도이 방법이 도움이 될 것입니다. 환호