2016-09-11 1 views
0

J'essaie de chaîner deux observables. Je travaille avec le framework Ionic2. Le premier observable essaie d'obtenir un jeton d'accès à partir d'un appareil mobile puis le second observable appelle ensuite l'API avec ce jeton d'accès. Mais pour une raison quelconque, le second observable n'est jamais appelé même si je suis abonné à la chaîne.Chaînage de deux observables http et stockage

Qu'est-ce qui me manque?

this.observableChain = Observable.fromPromise(this.storage.get('accessToken')) 
    .map(accessToken => this.http.post('http://1234/user/login', {'accessToken': accessToken})) 
    .subscribe(function(result) { 
    console.log(result); 
    }, function(error) { 
    console.log(error); 
    }); 

Merci d'avance.

+1

Avez-vous essayé 'flatMap()' 'au lieu de la carte()'? – Brad

+0

Flatmap l'avait corrigé. Merci beaucoup. Pourriez-vous m'expliquer pourquoi cela l'a corrigé? – Twoez

+0

Je pourrais essayer de l'expliquer, mais je suis en train d'apprendre Observables moi-même en utilisant Ionic2 donc j'espère que ce lien vous aide - http://reactivex.io/documentation/operators/flatmap.html. La règle simple est que si vous avez besoin de renvoyer le flux d'un autre observable (ou dans votre cas faire une autre requête http) alors 'flatMap()' est votre ami. Je peux l'afficher comme réponse si vous le souhaitez. – Brad

Répondre

1

Lorsque enchaînant vous devez observables utiliser flatMap().

Observable.fromPromise(this.storage.get('accessToken')) 
    .flatMap(accessToken => 
     this.http.post('http://1234/user/login', {'accessToken': accessToken}) 
    ) 
    .subscribe(
     result => console.log(result), 
     error => console.log(error) 
    ); 

Une bonne explication de ce concept se trouve ici - http://reactivex.io/documentation/operators/flatmap.html

0

Vous vous êtes abonné, mais il n'y a pas d'abonnement à la chaîne. Votre premier observable émet un observable, auquel il n'est jamais abonné. Fondamentalement, vous devez faire quelque chose comme ceci:

obs1.subscribe(obs2 => obs2.subscribe(result => ...)) 

HTH