77 votes

Chaîner des observables dans RxJS

Je suis en train d'apprendre RxJS et Angular 2. Disons que j'ai une chaîne de promesses avec plusieurs appels de fonctions asynchrones qui dépendent du résultat de la fonction précédente, ce 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 la même chose en utilisant uniquement RxJS sans l'utilisation de promesses ont donné le résultat 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);
});

Elle donne le même résultat que la chaîne de promesses. Mes questions sont les suivantes

  1. Est-ce que je fais bien les choses ? Y a-t-il des améliorations liées à RxJS que je peux apporter au code ci-dessus ?

  2. Comment puis-je faire en sorte que cette chaîne d'observables s'exécute de manière répétée ? Par exemple, l'ajout d'un autre abonnement à la fin ne produit qu'un 6 supplémentaire alors que je m'attends à ce qu'il imprime 1, 3 et 6.

    observableChain.subscribe((finalResult) => { console.log(finalResult) ; }) ;

    observableChain.subscribe((finalResult) => { console.log(finalResult) ; }) ;

    1 3 6 6

59voto

user3743222 Points 12564

À propos de la composition des promesses par rapport à 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 :

En gros, 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 qu'elles arrivent ? Dans le premier cas, vérifiez l'option publishReplay opérateur. Dans le second cas, l'abonnement standard est suffisant. Cependant, vous devrez peut-être faire attention à la dichotomie froid/chaud 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X