Цепные наблюдаемые в RxJS

Я изучаю RxJS и Angular 2. Допустим, у меня есть цепочка обещаний с несколькими вызовами асинхронных функций, которые зависят от результата предыдущего, который выглядит следующим образом:

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);
});

Мои попытки сделать то же самое исключительно с использованием RxJS без использования обещаний привели к следующему:

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);
});

Он дает тот же результат, что и цепочка обещаний. Мои вопросы

Я делаю это правильно? Есть ли какие-либо улучшения, связанные с RxJS, которые я могу внести в приведенный выше код

Как заставить эту наблюдаемую цепочку повторяться? т.е. добавление другой подписки в конце просто приводит к дополнительным 6, хотя я ожидаю, что это напечатает 1, 3 и 6.

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

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

1 3 6 6

 arcseldon05 мая 2019 г., 13:25
Вот рабочий пример цепочки обещаний с использованием rxjs6:stackoverflow.com/a/55991374/1882064

Ответы на вопрос(1)

Решение Вопроса

О составе обещаний и Rxjs, поскольку это часто задаваемый вопрос, вы можете обратиться к ряду ранее заданных вопросов по SO, среди которых:

Как сделать последовательность цепочек в rxjsRxJS Promise Composition (передача данных)Последовательность RxJS эквивалентна обещанию .then ()?

В принципе,flatMap является эквивалентомPromise.then.

По второму вопросу: хотите ли вы воспроизвести уже выданные значения или хотите обрабатывать новые значения по мере их поступления? В первом случае проверьтеpublishReplay оператор. Во втором случае стандартной подписки вполне достаточно. Однако вам может понадобиться знать о холоде. против горячей дихотомии в зависимости от вашего источника (ср.Горячие и холодные наблюдаемые: есть ли «горячие» и «холодные» операторы? для иллюстрированного объяснения концепции)

Ваш ответ на вопрос