J'apprends RxJS et Angular 2. Supposons que j'ai une chaîne de promesses avec plusieurs appels de fonctions asynchrones qui dépendent du résultat précédent, qui ressemble à ceci:
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 de même en utilisant uniquement RxJS sans utiliser de promesses ont donné les résultats suivants:
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);
});
Il produit le même résultat que la chaîne de promesses. Mes questions sont
Est-ce que je le fais bien? Existe-t-il des améliorations liées à RxJS que je peux apporter au code ci-dessus?
Comment puis-je obtenir cette chaîne observable pour exécuter à plusieurs reprises? c’est-à-dire que l’ajout d’un autre abonnement à la fin ne produit que 6 exemplaires supplémentaires, mais j’espère qu’il en imprimera 1, 3 et 6.
observableChain.subscribe ((finalResult) => {console.log (finalResult);});
observableChain.subscribe ((finalResult) => {console.log (finalResult);});
1 3 6 6
À propos de la composition de promesses par rapport à Rxjs, cette question étant fréquemment posée, vous pouvez vous référer à un certain nombre de questions précédemment posées sur les SO, notamment:
Fondamentalement, flatMap
est l'équivalent de Promise.then
.
Pour votre deuxième question, voulez-vous rejouer les valeurs déjà émises ou voulez-vous traiter les nouvelles valeurs au fur et à mesure de leur arrivée? Dans le premier cas, vérifiez l'opérateur publishReplay
. Dans le second cas, un abonnement standard suffit. Cependant, vous devrez peut-être être conscient du froid. dichotomie chaude en fonction de votre source (cf. observables chauds et froids: existe-t-il des opérateurs "chauds" et "froids"? pour une explication illustrée du concept)