2015-09-22 1 views
0

Возьмем следующую Машинопись/Угловое образец 2 кода:Что такое реактивный способ свернуть элементы в массив?

query(): Rx.Observable<any> { 

    return Observable.create((o) => { 

     var refinedPosts = new Array<RefinedPost>(); 

     var observable = this.server.get('http://localhost/rawData.json').toRx().concatMap(
     result => 
      result.json().posts 

     ) 
     .map((post: any) => { 

      // Assume I want to convert the raw JSON data into a nice class object with 
      // methods, etc. 
      var refinedPost = new RefinedPost();  
      refinedPost.Message = post.Message.toLowerCase(); 


      refinedPosts.push(refinedPost); 
     }) 
     .subscribeOnCompleted(() => { 
      o.onNext(refinedPosts); 
     }) 


    }); 

} 

выписал, база данных возвращается JSON. Я хочу перебирать необработанный JSON и создавать пользовательский объект, в конечном итоге возвращая подписчикам Array<RefinedPost>.

Код работает, и конечные подписчики получают то, что им нужно, но я не могу не чувствовать, что я не делал этого «Реактивный путь». Я обманул и использовал внешний накопитель, чтобы собрать элементы в массиве, которые, похоже, преследуют цель использования потоков.

Итак, вопрос в том, есть ли лучший, более сжатый, реактивный способ написать этот код?

ответ

0

Отвечая на мой собственный вопрос.

query(): Rx.Observable<any> { 

return this.server.get('http://localhost/rawData.json').toRx().concatMap(
    result => 
     result.json().posts 
    ) 
    .map((post: any) => { 
     var refinedPost = new RefinedPost(); 
     refinedPost.Message = post.Message.toLowerCase(); 

     return refinedPost; 

    }).toArray(); 
} 

Это удаляет внутренний аккумулятор и обернутый наблюдаемый. toArray() взял последовательность элементов и объединил их в массив.

+2

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

+1

Вы также можете передать функцию, которую вы имеете в 'map', в' concatMap' в качестве второго аргумента. вы просто меняете сигнатуру функции на '(result, post) => {}'. Он будет вызываться для каждого разворачиваемого элемента из 'result.json(). Posts' – paulpdaniels