关于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中这对我来说是非常出乎意料的行为。读完publishReplay
会重播错误,我希望只会看到该错误,而不会看到最后一个正确的值。
这真的是设计使然吗?或者仅仅是某种古怪的副作用而已?