Возьмем следующую Машинопись/Угловое образец 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>
.
Код работает, и конечные подписчики получают то, что им нужно, но я не могу не чувствовать, что я не делал этого «Реактивный путь». Я обманул и использовал внешний накопитель, чтобы собрать элементы в массиве, которые, похоже, преследуют цель использования потоков.
Итак, вопрос в том, есть ли лучший, более сжатый, реактивный способ написать этот код?
'toArray' работает только для завершенной коллекции. Но если вы хотите получить массив значений в реальном времени, вы можете использовать оператор 'scan'. – xgrommx
Вы также можете передать функцию, которую вы имеете в 'map', в' concatMap' в качестве второго аргумента. вы просто меняете сигнатуру функции на '(result, post) => {}'. Он будет вызываться для каждого разворачиваемого элемента из 'result.json(). Posts' – paulpdaniels