返回分块数组的可观察函数
Observable function to returned a chunked array
我有一个 returns 类似于 Observable<[number, Array<DataItem>]>
的函数。是否可以使用一些 Observable 函数编写一些 returns Observable<[number, Array<PageWithDataItems>]
的函数,给定一个函数 chunk
(根据页面大小对 DataItem 数组进行分块)和一个简单的构造函数,该构造函数创建一个 PageWithDataItems分块的 DataItem 数组。
我所拥有的是一些订阅 Observable<[number, Array<DataItem>]>
然后创建一个新的 Observable 的代码,但我希望可以对 map, mapTo, switchMap
或类似的东西做同样的事情。我对所有 Observable 函数有点迷茫,有什么帮助吗?
我不完全确定你在这里要做什么,但我试了一下:
// stream would be your data... just random chunks of numbers as an example here.
const stream = Rx.Observable.range(0, 480).bufferWithCount(100).select(d => [Math.random() * 100, d]);
class DataChunk<T> {
constructor(public data: Array<T>) { }
}
const pageSize = 10;
stream
// I do not understand what the 'number' in your [number, Array<DataItem>]
// represents. But it is the 'someNumber' item here..
.map(d => ({someNumber: <number>d[0], data: <number[]>d[1]}))
.map(d => ({
someNumber: d.someNumber,
pages: Ix.Enumerable
.fromArray(d.data)
.select((item, idx) => ({ pageNr : idx % pageSize, item: item }))
.groupBy(i => i.pageNr)
.select(pageItems => new DataChunk(pageItems.select(i => i.item).toArray()))
.toArray()
}))
.subscribe(dataInfo => {
// here each dataInfo sent down the stream will have been split up in to chunks
// of pageSize
log('Data recieved: ');
log(' someNumber: ' + dataInfo.someNumber);
log(' page count: ' + dataInfo.pages.length);
});
jsfiddle 上的工作示例。
我使用 IxJS 进行分块。它的工作方式与 RxJS 类似,但对集合(例如数组)进行操作,而不是像 RxJS 那样对事件流进行操作。我希望这接近你想要的,你的问题不是很清楚。
我有一个 returns 类似于 Observable<[number, Array<DataItem>]>
的函数。是否可以使用一些 Observable 函数编写一些 returns Observable<[number, Array<PageWithDataItems>]
的函数,给定一个函数 chunk
(根据页面大小对 DataItem 数组进行分块)和一个简单的构造函数,该构造函数创建一个 PageWithDataItems分块的 DataItem 数组。
我所拥有的是一些订阅 Observable<[number, Array<DataItem>]>
然后创建一个新的 Observable 的代码,但我希望可以对 map, mapTo, switchMap
或类似的东西做同样的事情。我对所有 Observable 函数有点迷茫,有什么帮助吗?
我不完全确定你在这里要做什么,但我试了一下:
// stream would be your data... just random chunks of numbers as an example here.
const stream = Rx.Observable.range(0, 480).bufferWithCount(100).select(d => [Math.random() * 100, d]);
class DataChunk<T> {
constructor(public data: Array<T>) { }
}
const pageSize = 10;
stream
// I do not understand what the 'number' in your [number, Array<DataItem>]
// represents. But it is the 'someNumber' item here..
.map(d => ({someNumber: <number>d[0], data: <number[]>d[1]}))
.map(d => ({
someNumber: d.someNumber,
pages: Ix.Enumerable
.fromArray(d.data)
.select((item, idx) => ({ pageNr : idx % pageSize, item: item }))
.groupBy(i => i.pageNr)
.select(pageItems => new DataChunk(pageItems.select(i => i.item).toArray()))
.toArray()
}))
.subscribe(dataInfo => {
// here each dataInfo sent down the stream will have been split up in to chunks
// of pageSize
log('Data recieved: ');
log(' someNumber: ' + dataInfo.someNumber);
log(' page count: ' + dataInfo.pages.length);
});
jsfiddle 上的工作示例。
我使用 IxJS 进行分块。它的工作方式与 RxJS 类似,但对集合(例如数组)进行操作,而不是像 RxJS 那样对事件流进行操作。我希望这接近你想要的,你的问题不是很清楚。