2016-07-19 3 views
0

У меня есть функция, которая возвращает что-то вроде Observable<[number, Array<DataItem>]>. Можно ли написать некоторую функцию, которая возвращает Observable<[number, Array<PageWithDataItems>] с использованием некоторых функций Observable, заданных функцией chunk (куски массива DataItem в соответствии с размером страницы) и простой конструктор, который создает объекты PageWithDataItems с массивным массивом DataItem. У меня есть код, который подписывается на Observable<[number, Array<DataItem>]>, а затем создает новый Observable, но я надеюсь, что можно будет сделать то же самое с map, mapTo, switchMap или аналогичным. Я немного потерян во всех функциях Observable, поэтому любая помощь?Наблюдаемая функция для возврата выделенного массива

+0

Не могли бы вы выслать код, который у вас уже есть? Я не на 100% отмечу, что вы используете. – paulpdaniels

ответ

1

Я не совсем уверен, что вы собираетесь здесь, но я дал ему выстрелили:

// 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, чтобы сделать chunking. Он работает аналогично RxJS, но работает с коллекциями (например, массивами), а не с потоками эвенов типа RxJS. Надеюсь, это было близко к тому, что вы хотели, ваш вопрос не совсем ясен.

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

  • Нет связанных вопросов^_^