Как работает Reactive Extension Operator SkipLast? - PullRequest
0 голосов
/ 14 декабря 2018

В документации Reactivex.IO было указано, что

Вы можете игнорировать последние n элементов, испускаемых Observable, и обслуживать только те элементы, которые предшествуют им, изменяя Observable с помощью SkipLast.оператор.

и диаграмма из http://reactivex.io/documentation/operators/skiplast.html enter image description here

Мои ожидания: SkipLast будет читать все наблюдаемые, пока не встретит OnCompletedи затем генерирует новую Наблюдаемую с временами как Исходная, но пропускающая Последние.

Мое сомнение: Как Оператор SkipLast узнает, что «3» является последним 2-м элементом из Наблюдаемой?Не видя OnCompleted, как он может сказать последний n-й элемент?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Из исходного кода , если используется skipLast(N), то сообщения N сохраняются в массиве this._ring.Как только N + 1 прибыл, первое сообщение отправлено, N + 2 прибыло => второе сообщение отправлено и т. Д.

0 голосов
/ 17 декабря 2018

Спасибо @PanagiotisKanavos, @akarnokd за ценные комментарии.

Это внутренне реализовано с помощью очереди фиксированного размера.Возьмите элементы из последовательности и поставьте их в очередь, когда очередь заполнена и начинается переполнение. Отмените очередь элемента и поставьте в очередь последнее значение и отправьте OnNext (dequeued_value), поэтому при достижении OnCompleted вы не будете отправлять кэшированные элементы и просто вызывать OnCompleted,К этому последнему N кешированных элементов пропускаются.

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