Rxjs 如何计算未完成的可观察量<;可观察>;排放

Rxjs 如何计算未完成的可观察量<;可观察>;排放,rxjs,Rxjs,我有一个可以观察到的东西,它发出可以观察到的东西。我想发出当前未完成的可观测排放计数 根据这个大理石图: --a-----b-------c------ a-------------------------| b----X c---------| ___________________ --1-----2----1--2---------1-0 我该怎么做?计算新的排放量相当容易,但会出现错误和完成情况?您可以创建一个主题,供所有其他观察对象

我有一个可以观察到的东西,它发出可以观察到的东西。我想发出当前未完成的可观测排放计数

根据这个大理石图:

--a-----b-------c------
  a-------------------------|
        b----X
                c---------|
___________________
--1-----2----1--2---------1-0

我该怎么做?计算新的排放量相当容易,但会出现错误和完成情况?

您可以创建一个主题,供所有其他观察对象使用,以告知其当前状态。然后,您可以使用此主题将状态减少到当前活动的可观察对象的数量

看这个


根据@chromate和其他人的建议,我提出了以下解决方案:

Rx.Observable.prototype.streamLifecycleCounter=函数(){
const _this=this;//对上游可观察对象的引用
返回Rx.observate.create(observator=>{
onNext观察员(1);
把这个还给我(
()=>{},/*对实际值不感兴趣*/
错误=>{
onNext观察员(-1);
observer.onCompleted();
},
() => {
onNext观察员(-1);
observer.onCompleted();
}
);
});
};
const scheduler=new Rx.TestScheduler();
const results=scheduler.startScheduler(
() => {
返回接收可观测范围(1,5)
.map(i=>Rx.Observable.just(i).delay(i*1000,调度器))
.flatMap(obs=>obs.streamLifecycleCounter())
.startWith(0)
.扫描((acc,curr)=>acc+=curr,0)
.do(console.log);
},
{处置:15000}
);
这将导致以下控制台输出:

01 2 3 4 5 4 3 2 1 0


好主意,干得好,马克!对于那些希望看到这个实现并使用它的人,我已经将它移植到了RxJS 5上(没有使用
TestScheduler
)。我删除了
Create()
周围的
Defer()
,因为事后看来它没有多大意义
const meta$ = new Rx.Subject();

// Create some streams that we can observe.
const stream1$ = Rx.Observable.interval(300);
const stream2$ = Rx.Observable.timer(1000)
  .switchMap(() => Rx.Observable.interval(500).startWith(0))
  .take(10);
const stream3$ = Rx.Observable.timer(1500)
  .switchMap(() => Rx.Observable.interval(500).startWith(0))
  .take(2);


stream1$.subscribe(
  next => meta$.next({ stream1: true }),
  () => meta$.next({ stream1: false }),
  () => meta$.next({ stream1: false })
);
stream2$.subscribe(
  next => meta$.next({ stream2: true }),
  () => meta$.next({ stream2: false }),
  () => meta$.next({ stream2: false })
);
stream3$.subscribe(
  next => meta$.next({ stream3: true }),
  () => meta$.next({ stream3: false }),
  () => meta$.next({ stream3: false })
);

meta$
  .scan((state, next) => {
    return Object.assign({}, state, next);
  })
  .map(obj => {
    return Object.keys(obj)
      .map(key => +obj[key])
      .reduce((acc, x) => acc + x, 0)
  })
  .take(50) // don't create endless loop
  .timestamp()
  .subscribe(x => console.log(x));