Много написано о разнице между publishReplay(1), refCount()
и чем она отличается от shareReplay(1)
.
Обработка ошибок отличается. publishReplay(), refCount()
воспроизведет ошибку, тогда как shareReplay(1)
перезапустит поток.
Существует также различная обработка , когда все подписчики отписались.
Этот вопрос не об одном из них!
Я хочу знать, почему происходит следующее:
// 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
Результат:
- Последнее «хорошее» значение было сохранено в ReplaySubject, созданном
publishReplay
- Ошибка также сохраняется (я не уверен, где именно)
- Примечание: метки времени (13337 и 14216) одинаковы, поэтому воспроизводятся те же самые элементы и наблюдаемые ошибки.
Это было очень неожиданное поведение для меня. Прочитав, что publishReplay
будет воспроизводить ошибки, я ожидал увидеть только ошибку, а не последнее известное значение.
Это действительно задумано - или просто какой-то изворотливый побочный эффект, который является одной из тех вещей?