Подтвердить что ты не робот

Наблюдение цепочек в RxJS

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

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 без использования promises вызвали следующее:

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

4b9b3361

Ответ 1

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

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

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