2015-07-29 1 views
3

Je suis un peu nouveau chez RxJs et j'essaie de mélanger le monde des promesses et des observables.Convertir un flux de promesses en un flot de valeurs

Voici ce que je veux: J'ai une observable (appeler clickObs) qui écoute un clic et à la suite interroge une base de données, la production d'une promesse qui résout à une valeur lorsque l'interrogation de base de données se termine (avec succès). Mon observable génère ainsi un flux de promesses à partir d'un flux de clics, et ce que je veux c'est générer à partir de cet observable, un flux de valeurs résolues correspondantes.

Des questions passées sur StackOverflow, j'ai lu defer, flatMap, mergeAll et fromPromise, mais ne peut pas obtenir ma tête autour de la façon d'articuler les quatre pour résoudre mon problème.

Des suggestions?

Répondre

1

Vous ne devriez pas avoir tous les quatre, il suffit de regarder à flatMap ou ses frères et soeurs flatMapLatest

clickObs.flatMapLatest(function() { 
    //Access the db and return a promis 
    return database.query(queryObj); 
}) 
.subscribe(function(result) { 
    //Result is implicitly flattened out 
    /*Do something with the result*/ 
}); 

flatMap convertira implicitement une promesse ou d'un objet semblable à un tableau dans un Observable et aplatir la séquence résultante. FlatMapLatest est similaire mais ignore les anciens événements, si un nouveau arrive avant que le précédent ne soit terminé.

+0

Oui, ça marche, merci. Je suis d'accord que dans mon cas d'utilisation'flatMapLatest 'est le chemin à parcourir. – user3743222

+0

Pour ceux qui aiment lire plus loin, juste tombé sur cet article, qui explique merveilleusement ce cas précis: https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 – user3743222

+1

Notez que simplement ignorer les événements anciens plutôt que de les annuler est souvent inapproprié, il est Il est souvent préférable de spécifier explicitement comment fonctionne la fonction plutôt que de simplement renvoyer une promesse si cela s'applique. –