Почему publishReplay (1), refCount () воспроизводят как последнее правильное значение, так и последнюю ошибку? - PullRequest
0 голосов
/ 10 января 2019

Много написано о разнице между 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 будет воспроизводить ошибки, я ожидал увидеть только ошибку, а не последнее известное значение.

Это действительно задумано - или просто какой-то изворотливый побочный эффект, который является одной из тех вещей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...