Comment puis-je résoudre une Observable à l'intérieur d'un autre Observable? - rxjs
J'ai un Observable
dans lequel je consommer une autre observable, mais la 2ème Observable
je n'arrive pas à résoudre. Voici le code:
return Observable.fromPromise(axios(config))
.map(res => {
return {
accessToken: res.data.access_token,
refreshToken: res.data.refresh_token
}
})
.map(res => {
return {
me: getMe(res.accessToken),
accessToken: res.accessToken,
refreshToken: res.refreshToken
}
})
function getMe(accessToken) {
return Observable.fromPromise(axios.get({
url: 'https://api.spotify.com/v1/me',
}));
}
La getMe
fonction renvoie un Observable
, mais il n'est jamais résolu. J'ai essayé d'ajouter un flatMap
et un concat
, mais il n'est toujours pas résolu. Comment puis-je obtenir le getMe
à résoudre?
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayez les solutions suivantes (Également non testé):
Comme mentionné dans le post ci-dessus,
flatMap
renvoie une observable.map
est par la suite utilisé pour fusionnerres
avec le résultatres2
retourné à partir de la deuxième promesse.Également noter que
fromPromise
est un froid observables. Cela signifie que vous devez avoir un abonnement pour lancer les choses. Dans votre cas, je suppose que vous avez déjà quelque chose comme ceci:res
de la fermeture. Je ne suis pas sûr à ce sujet, mais la fonction anonyme avecres.me
dans son corps, est exécuté/évalué que lorsquegetMe
émet une valeur, au moment où je me demande si leres
toujours variable conserve sa valeur. Je code avec précaution autour de cela, à l'aide de pures fonctions en rapport avec les phénomènes observables. Donc, je suis intéressé de savoir si je suis trop prudent.res
gardera sa valeur (j'ai utilisé cette technique). Je ne le pensons qu'il est préférable d'avoir un style défensif de codage et de test de profondeur. Comme une note de côté, si il y a un deuxièmeRx.Observable.fromPromise(axios(config))
exécution avantgetMe()
résout alors vous aurez 2 abonnez-vous à des exécutions. Ceci peut être facilement résolu en utilisantflatMapLatest
qui permettra d'assurer que vous aurez toujours la dernièregetMe()
réponse avec un abonnez-vous de l'exécution.fromPromise
comme un froid Observables. Bien que la valeur elle-même sera mis en cache, le faisant apparaître comme un froid Observable à toutes les flux d'abonnés. Lepromise
lui-même est impatient et commencer l'exécution immédiatement, indépendamment de l'abonnement.Comme @user3743222 l'a souligné, un
Observable
ne pasresolve
dans le sens où unPromise
n'. Si vous voulez que la valeur de lagetMe
méthode, vous aurez besoin de vous abonner à laObservable
retournés par elle.Exemple de code à trouver, ci-dessous (non testé!!). Quelques explications :
getMe
n'est pas aplati, ('résoudre' appartiennent au monde de promesses), parce que lemap
opérateur de ne pas aplatir les phénomènes observables.flatMap
faire, mais vous avez besoin de l'utiliser dans le formulairesource.flatMap(function(x){return observable})
et voici ce que vous retournez est unPOJO
pas unRx.Observable
.getMe
nous utilisons unflatMap
.accessToken
etrefreshToken
) nous utilisonswithLatestFrom
sur les observables qui a émis leres
objet (res$
).Nous utilisons
share
que nous vous abonner à deux reprises pourres$
, et nous voulons tous les abonnés de voir les mêmes valeurs.Promises
. Il y a une manière plus concise.Rx.Observable.fromPromise
n'est que de cette façon que vous avez le meilleur des deux mondes.