【问题标题】:How to preserve a 'complete' event across two RxJS observables?如何跨两个 RxJS 可观察对象保留“完整”事件?
【发布时间】:2021-04-25 07:48:16
【问题描述】:

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

我需要将其映射到另一个可观察对象,例如像这样:

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

但现在生成的 observable mapped 发出 1、2、3 但不是完整的事件。

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

【问题讨论】:

标签: rxjs observable


【解决方案1】:

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

【讨论】:

  • 你是对的。我用Observable.create 做了那个例子来代替我正在处理的复杂情况,但没有费心去检查它。我正在查看我原来的情况,看看我是否能找出发生了什么
  • 我认为问题可能是最初我的concatMap 返回了一个有时永远不会发出任何东西的可观察对象(使用observer.next
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多