2017-09-12 2 views
0

Je suis confronté à un comportement aléatoire avec l'opérateur flatMap et je ne trouve pas la raison pour laquelle. Parfois, il se déclenche, parfois il ne le fait pas ...Observables: flatMap non déclenché aléatoirement

Voici la situation: L'utilisateur peut changer la langue dans mon application, donc j'ai un BehaviorSubject sur la langue (qui est déclenchée par une liste de sélection) retourné comme observable par son fournisseur. Quand il y a une modification, j'appelle (via flatMap) une requête http pour récupérer les données dans la langue sélectionnée.

Il ressemble à ceci:

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

La chose est, quand je change la langue de l'appel http est le plus souvent pas déclenché.

Si j'ajouter d'un simple travail toujours y souscrire ...

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

Toute idée pourquoi j'ai cette question?

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

Merci beaucoup

Répondre

0

OK, il fixe.

Il n'a pas été fait au hasard ...

Dans mon (simplifié) extrait je n'ai pas écrit comment je géré la réponse du serveur. En fait, je pourrais recevoir un CODE DE STATUT 304 si j'essayais d'extraire des données qui n'ont pas changé sur le serveur (je fais cela pour éviter de télécharger les données du serveur chaque fois qu'un utilisateur démarre l'application)

LA CHOSE EST, j'avais pour gérer le 304 dans le rappel d'erreur puisque angulaire prend tout ce qui est au-dessus de 299 comme une erreur.

CE QUE JE N'AI PAS SAVÉ était que le rappel d'erreur était en train de tuer mon observable. Donc le pseudo comportement "aléatoire" était en fait: - Si j'essayais de recharger l'application sans changer la langue, alors j'ai obtenu un 304, donc l'observable a été tué - Si j'ai essayé de recharger l'application après avoir changé la langue, alors le app chercherait les données pour cette langue et obtenir un 200. Donc l'obserbavle continuerait à travailler

Peut-être que cela aidera quelqu'un. Cheers