如何在两个RxJS可观察对象之间保留“完成”事件?

时间:2019-02-21 01:06:41

标签: rxjs observable complete

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

我需要将此映射到另一个可观察到的像这样

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

但是现在生成的可观察的mapped发出1,2,3而不是完整事件。

如何在mapped中保存完整的事件?

1 个答案:

答案 0 :(得分:2)

您的代码仅给我“ 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'))