Цепочки наблюдаемых в 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);
});

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

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

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

    observableChain.подписаться((finalResult) => { приставка.log (finalResult); });

    observableChain.подписаться((finalResult) => { приставка.log (finalResult); });

    1 Три Шесть 6

1 ответов


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

по сути, flatMap эквивалентно Promise.then.

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