首页 > 解决方案 > 如何跨两个 RxJS 可观察对象保留“完整”事件?

问题描述

我有一个 observable const numbers = from([1,2,3]),它将发出 1、2、3,然后完成。

我需要将其映射到另一个可观察的,例如:

const mapped = numbers.pipe(
   concatMap(number => Observable.create(observer => {
     observer.next(number);
   }))
 );

但是现在生成的 observablemapped发出 1, 2, 3 但不是完整的事件。

如何保存完整的事件mapped

标签: rxjsobservable

解决方案


您的代码只给了我“ 1”(使用 RxJS 6);你确定你看到3个值吗?

Rx.from([1,2,3]).pipe(
   op.concatMap(number => Rx.Observable.create(observer => {
     observer.next(number);
   }))
 ).forEach(x => console.log(x)).then(() => console.log('done'))

您永远不会完成创建的 Observable(它发出一个值但从不调用observer.complete())。这有效:

Rx.from([1,2,3]).pipe(
   op.concatMap(number => Rx.Observable.create(observer => {
     observer.next(number); observer.complete();
   }))
 ).forEach(x => console.log(x)).then(() => console.log('done'))

这一切都表明正确使用是多么困难Rx.Observable.create()。使用 Rx 的目的是使用更高级别的抽象来编写代码。其中很大一部分是更喜欢使用运算符而不是观察者。例如在你的情况下(这很简单):

Rx.from([1,2,3])
  .pipe(op.concatMap(number => Rx.of(number)))
  .forEach(x => console.log(x)).then(() => console.log('done'))

推荐阅读