为什么publishReplay(1),refCount()重播最后一个有效值和最后一个错误?

时间:2019-01-10 10:21:08

标签: rxjs

关于publishReplay(1), refCount()之间的区别以及与shareReplay(1)的区别有很多文章。

错误处理不同。 publishReplay(), refCount()将重播错误,而shareReplay(1)将重新启动流。

所有订阅者都已退订时,还有different handling

这个问题不是关于这两个问题!


我想知道为什么会发生以下情况:

// stream that emits 0, 1, 2, ERROR
const timestamp = () => Number(new Date()) % 100000;
const source = timer(1000, 1000).pipe(
                  switchMap((i) => (i==3) ? throwError('Error at ' + timestamp()) : 
                                            of(i + ' - ' + timestamp()) ));

// subscribe to this stream with publishReplay(1), refCount()
const publishReplayObs = source.pipe(publishReplay(1), refCount());
publishReplayObs.subscribe(x => console.log(x), (err) => console.log('Error: ' + err));

// after it has errored, wait a few seconds
setTimeout(() => {

    console.log('--------- resubscribe -----------');
    publishReplayObs.subscribe(x => console.log(x), (err) => console.log('Error: ' + err));

}, 10000);

产生:

  

0-11490

     

1-12223

     

2-13337

     

错误:14216错误

     

---------重新订阅-----------

     

2-13337

     

错误:14216错误

结果:

  • 最后一个“好”值已存储在publishReplay创建的ReplaySubject中
  • 错误也被存储了(我不确定确切的位置)
  • 注意:时间戳(13337和14216)是相同的-因此,它是完全相同的项目,并且正在播放错误可观察的结果。

这对我来说是非常出乎意料的行为。读完publishReplay会重播错误,我希望只会看到该错误,而不会看到最后一个正确的值。

这真的是设计使然吗?或者仅仅是某种古怪的副作用而已?

0 个答案:

没有答案