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

  1. 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

  2. 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

37
demandé sur user3743222 2016-06-12 10:42:06

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:

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)

32
répondu user3743222 2017-05-23 12:34:47