将元素折叠为数组的反应方式是什么?

时间:2015-09-22 18:24:59

标签: json angularjs typescript reactive-programming rxjs

采用以下TypeScript / Angular 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>

代码有效,最终用户可以得到他们需要的东西,但我不禁觉得我没有做到“反应方式”。我作弊并使用外部累加器来收集数组中的元素,这似乎打败了使用流的目的。

所以,问题是,是否有更好,更简洁,更有效的方式来编写这段代码?

1 个答案:

答案 0 :(得分: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();
}

这将删除内部累加器和包装的Observable。 toArray()接受了一系列项目并将它们组合成一个数组。