Json 将元素折叠成阵列的反应方式是什么?
以下面的TypeScript/Angular 2代码示例为例: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(
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为每个展开的项调用