2017-02-19 48 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