2017-02-19 52 views
6

我有名單,這應該模擬流:獲取的角度可觀察到流作爲數組

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'you在每個事件之後獲得一個更新的數組,並且'toArray'只有在observable完成時纔會得到一個數組。 –

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)'創建一個類型爲array的元素的序列,'map'應用於可觀察值,在這種情況下它是數組。 – kemsky