Чтобы получить этот вывод, вы можете использовать toArray
и mergeMap
, но вы должны составить их перед take(3)
:
Rx.Observable.from([1, 2, 3, 4, 5])
.toArray()
.mergeMap(array => array.reverse())
.take(3)
.subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
Это будет нормально работать, если у вас есть наблюдаемый, который испускает относительно небольшое количество значений до его завершения. Если у вас есть наблюдаемые, который излучает сколь угодно большое количество значений, и вы хотите только последние три - в обратном порядке - вы можете использовать reduce
, чтобы избежать необходимости буферизации каждое испускаемое значения:
Rx.Observable.from([1, 2, 3, 4, 5])
.reduce((acc, value) => {
acc.unshift(value);
if (acc.length > 3) {
acc.pop();
}
return acc;
}, [])
.mergeAll()
.subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>