RxJS需要具有默认值的shareReplay

时间:2016-03-21 15:39:34

标签: javascript rxjs

问题在于startWithshareReplay合并得很差。

如果您使用source.startWith(0).shareReplay(1),则新订阅将始终以0开头,shareReplay无意义,source.shareReplay(1).startWith(0)稍微好一点,但会导致新订阅收到两个值。

预期:

source ---1---2----3---4----5
ob1    0--1---2----3---4----5
ob2             2--3---4----5

更新:似乎我的最小化案例太小了。我的问题是我使用ob1ob2切换到switch,这意味着ob1会在ob2订阅之前取消订阅。奇怪的是,如果我只使用shareReplay(1),它可以正常工作,但startWith(0).shareReplay(1)的组合却没有。

const main$ = new Rx.Subject()
const s1$ = new Rx.Subject()


// Expected:
// 0 1 2 2 3 4

//const s2$ = s1$.shareReplay(1).startWith(0)
// got: 
// 0 1 2 0 2 3 4

//const s2$ = s1$.startWith(0).shareReplay(1)
// got:
// 0 1 2 2 0 3 4

const s2$ = s1$.shareReplay(1)
// got:
// 1 2 2 3 4

main$.switch()
  .subscribe(
    v => console.log("1: " + v)
  )

main$.onNext(s2$)
s1$.onNext(1)
s1$.onNext(2)

main$.onNext(s2$)

s1$.onNext(3)
s1$.onNext(4)

1 个答案:

答案 0 :(得分:1)

我无法重现你的问题,我提出了一个jsfiddle:cf。 http://jsfiddle.net/qvb3xbqz/2/

var counter = 0;
 var validation$ = Rx.Observable
 .fromEvent(document.getElementById('validation'), 'click')
 .map(function(){return ++counter})
 .do(emits(ta_validation, 'First subscription'))
 .startWith(0)
 .shareReplay(1);

setTimeout(function (){
  validation$.do(emits(ta_change, 'second subscription')).subscribe(function(){})
}, 1000);

立即订阅一个订阅。第二次订阅在1秒后开始。您将看到它们的行为符合预期。或者我误解了什么?