2017-02-01 1 views

ответ

2

Чтобы получить этот вывод, вы можете использовать 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>

Смежные вопросы