2017-02-19 8 views
6

У меня есть список, который должен имитировать поток:Получить угловой Observable поток как массив

list = [ 
    {name : 'Str1', age: 10}, 
    {name : 'Str2', age: 10}, 
    {name : 'Str3', age: 10} 
]; 

и я создал Observable из этого списка:

Observable.from(this.list).skip(this.currentPage * this.pageSize).take(this.pageSize).subscribe(data => this.pagerList = data, console.error); 

И в подписываться метод Я получаю значения один за другим. Как я должен ждать, пока все данные будут возвращены, а затем, чтобы получить весь список. Существует оператор take(), и после него Observable должен остановиться.

Я не хочу ставить каждое значение по одному в массиве.

Я новичок здесь не только для угловых, но и для javascript.

ответ

3

Вы пробовали использовать toArray оператор ?.

let list = [ 
 
    { name: 'Str1', age: 10 }, 
 
    { name: 'Str2', age: 10 }, 
 
    { name: 'Str3', age: 10 }, 
 
    { name: 'Str4', age: 10 }, 
 
    { name: 'Str5', age: 10 }, 
 
    { name: 'Str6', age: 10 } 
 
]; 
 

 
let currentPage = 2; 
 
let pageSize = 2; 
 

 
Rx.Observable.from(list) 
 
    .skip(currentPage * pageSize) 
 
    .take(pageSize) 
 
    .toArray() 
 
    .subscribe(data => console.log(data), console.error);
<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.min.js"></script>

+0

Спасибо. Это прекрасно работает. – makkasi

3

Оператор scan должен делать то, что вы хотите

Observable.from(this.list) 
.skip(this.currentPage * this.pageSize) 
.take(this.pageSize) 
.scan([], acc, curr) => {acc.push(curr); return acc;}); 
.subscribe(data => this.pagerList = data, console.error); 

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan

+1

http://rxmarbles.com/#scan это как уменьшить, но после того, как результат получен. Спасибо за ответ. – makkasi

+1

С помощью 'scan' вы получите обновленный массив после каждого события и с помощью' toArray' вы получите только один массив в конце, когда завершится наблюдение. –

1

Я думаю, что это более подходящее решение:

Observable.of(this.list).map(x => x.slice(this.currentPage * this.pageSize)).map(x => x.slice(0, this.pageSize)).subscribe(data => this.pagerList = data, console.error); 
+0

Я не понимаю этого. В первой функции карты вы получаете объект. Как вы можете срезать объект? – makkasi

+2

'Observable.of (this.list)' создает последовательность из одного элемента, который является массивом, 'map' применяется к наблюдаемому значению, в этом случае это массив. – kemsky