【问题标题】:rxjs: use stream referring twice to an observable that has already completed upstreamrxjs:使用流两次引用已经在上游完成的可观察对象
【发布时间】:2016-12-07 22:38:35
【问题描述】:

在使用热可观察对象后,我无法从其获取值。

const partialState$ = Rx.Observable.of(1)
.publish().refCount();

const downstreamState$ = partialState$.map(v => ([v+1, v+2]));

const finalState$ = downstreamState$
// last value of partialState$ being requested -
// shouldn't matter if its completed through earlier chaining
.withLatestFrom(partialState$)
  
finalState$.subscribe(state => {  // this does not fire
	console.log('state', state);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-rc.5/Rx.js"></script>

这是小提琴:http://jsfiddle.net/j64te6jp/10/

上面的代码什么也没做 - 似乎是由于订阅的同步行为,partialState$ 直到推入 .subscribe 才被标记为准备好值 这永远不会发生,因为当downStreamState$ 向它请求最新信息时,partialState$ 尚不存在任何值。

有人可以解释为什么会发生这种情况,并提供一种从热门(已发布)可观察对象中重用相同值的好方法。谢谢。

【问题讨论】:

    标签: javascript stream rxjs reactive-programming reactivex


    【解决方案1】:

    这是因为您在发出值后订阅。为什么不使用.publishReplay()

    如果你还想避开publishReplay(),可以使用.delay(0)

    const partialState$ = Rx.Observable.of(1).delay(0)
      .publish().refCount();
    

    【讨论】:

    • 这是一个不错的选择,但它不会因为异步性而改变执行顺序(就像这里jsfiddle.net/j64te6jp/8/)?I 希望有一种方法可以兼顾两者。我想避免@ 987654327@ 也避免存储我真的不需要存储的额外状态
    • 这将使值在下一个周期中可用,届时您的订阅将处于活动状态。我在你的小提琴中试过了,它奏效了。
    • jsfiddle.net/j64te6jp/8 确实可行,但考虑到值 在第一个周期中准备就绪,我仍然觉得这应该是更好的方法。
    • 是的,但是如果你准备好后注册就看不到了(除非你使用replay)
    • 流不热,因为正在使用publish().refCount()。因此,在任何情况下,finalState$ 首次订阅之前,不应发出来自partialState$ 的值。 (更复杂的)问题和问题是:当提到已在同一流中上游某处消费的可观察对象时,例如,在某个下游点将值“带回”到流中,为什么不@ 987654331@ 开火,让流完全完成。
    【解决方案2】:

    这是向我建议的解决方案 - 非常感谢 https://github.com/Dorus

    const partialState$ = Rx.Observable.of(1)
    .do(() => console.log('i will be run once'))
    
    const finalState$ = partialState$.publish(partialState_ => {
    	const downstreamState$ = partialState_.map(v => ([v+1, v+2]));
    	return downstreamState$
    		.withLatestFrom(partialState_)
    })
      
    finalState$.subscribe(state => {
    	console.log('state', state);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-rc.5/Rx.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多