Enchaînement des Observables en RxJS
j'apprends RxJS et Angular 2. Disons que j'ai une chaîne promise avec plusieurs appels de fonction async qui dépendent du résultat du précédent qui ressemble à:
var promiseChain = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 2);
}, 1000);
});
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 3);
}, 1000);
});
});
promiseChain.then((finalResult) => {
console.log(finalResult);
});
mes tentatives de faire la même chose uniquement en utilisant RxJS sans l'utilisation de promesses produit le suivant:
var observableChain = Observable.create((observer) => {
setTimeout(() => {
observer.next(1);
observer.complete();
}, 1000);
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 2);
observer.complete()
}, 1000);
});
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 3);
observer.complete()
}, 1000);
});
});
observableChain.subscribe((finalResult) => {
console.log(finalResult);
});
donne le même résultat que la chaîne promise. Mes questions sont
-
est-ce que je fais ceci droit? Y a-t-il des améliorations liées à RxJS que je peux apporter au code ci-dessus
-
Comment faire pour que cette chaîne observable s'exécute de façon répétée? c'est-à-dire que L'ajout d'un autre abonnement à la fin ne produit qu'un 6 supplémentaire bien que je m'attende à ce qu'il imprime 1, 3 et 6.
observableChain.abonnez-vous ((finalResult) => { console.log(finalResult); });
observableChain.abonnez-vous ((finalResult) => { console.log(finalResult); });
1 Trois Six 6
1 réponses
à propos de promise composition vs. Rxjs, comme il s'agit d'une question fréquemment posée, vous pouvez vous référer à un certain nombre de questions précédemment posées sur SO, parmi lesquelles:
- Comment faire de la séquence de la chaîne dans rxjs
- RxJS Promesse Composition (transmission des données)
- RxJS séquence equvalent la promesse.alors()?
Fondamentalement, flatMap
est l'équivalent de Promise.then
.
Pour votre deuxième question, voulez-vous de relecture des valeurs déjà émis, ou voulez-vous traiter les nouvelles valeurs qu'ils arrivent? Dans le premier cas, vérifiez l'opérateur publishReplay
. Dans le second cas, l'abonnement standard est suffisant. Cependant, vous pourriez avoir besoin d'être conscient du froid. vs chaud dichotomie en fonction de votre source (cf. Chaud et Froid observables : il y a "chaud" et "froid" opérateurs? pour un livre illustré sur l'explication du concept)