Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 将元素折叠成阵列的反应方式是什么?_Json_Angularjs_Typescript_Reactive Programming_Rxjs - Fatal编程技术网

Json 将元素折叠成阵列的反应方式是什么?

Json 将元素折叠成阵列的反应方式是什么?,json,angularjs,typescript,reactive-programming,rxjs,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(

以下面的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并创建一个自定义对象,最终返回给订阅服务器一个数组

代码是有效的,最终的订阅者得到了他们所需要的,但我忍不住觉得我没有用反应式的方式来做。我作弊并使用外部累加器收集数组中的元素,这似乎违背了使用流的目的


所以,问题是,有没有更好、更简洁、更具反应性的方法来编写此代码?

回答我自己的问题

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将项目序列合并到一个数组中。

toArray仅对已结束的收集工作。但如果您想实时获取值数组,可以使用扫描运算符。您还可以将map中的函数作为第二个参数传递到concatMap中。您只需将函数签名更改为result,post=>{}。它将从result.json.posts为每个展开的项调用