【发布时间】:2018-08-17 22:03:34
【问题描述】:
我相信可以使用 flatMap 重构以下代码,但我似乎无法让它按预期工作。
我理解 flatMap 本质上是映射然后变平,这对我来说是完美的,因为我正在使用 forkJoin,所以从 getAutocompleteSuggestions() 获取一系列响应。
我想要订阅时的单个结果数组(这是下面的代码产生的结果),但是将顶级地图更改为 flatMap 会将多个单个对象发送到订阅。如何用 flatMap() 更好地编写这段代码?
const $resultsObservable: Observable<any> = Observable.of(query)
.switchMap(q => this.getAutocompleteSuggestions(q))
//tried changing the below to flatMap()
.map(res => {
return res.map(resp => {
const content = resp.content;
content.map(result => this.someMethod(result));
return content;
})
.reduce((flatArr, subArray) => flatArr.concat(subArray), []);
});
getAutocompleteSuggestions(query: string): Observable<any> {
const subs$ = [];
//... add some observables to $subs
return Observable.forkJoin(...subs$);
}
【问题讨论】:
-
content.map(…)行有错误或不清楚。由于您不使用它的结果,someMethod被执行,但不是可观察链中返回的结果。如果这是有意的,您应该在可观察级别上以副作用 (do) 运行它,并在数组级别上使用forEach。map(在两个级别上)用于映射数据,而不是执行副作用。 -
resp.content 是一个数组,所以我对其进行转换然后返回它,基本上丢弃了其他所有内容,并转换了我需要的数据
-
map不会就地修改数组。 -
可以,但是传入的变量(结果)是通过引用传递的,在(通过引用传递的)数组中修改和保持修改的对象
-
那么你应该使用
forEach。map不是为了副作用。代码可能有效,只是设计糟糕,违反了最小意外原则。
标签: javascript angular typescript rxjs rxjs5