每次我认为我理解Observables时,我都不太了解Observables。所以请考虑我在Angular 4应用程序中使用的代码:
// this returns the url to our bitbucket server. the uriService returns
// an Observable<string>
return this.uriService.getBitBucketUrl(path)
// I expect exactly one result, no more, no less, otherwise exception
.single()
// somehow I still need a flatMap here, to supply the url value into the nested observable
.flatMap((url: string) => {
// we now have the bitbucket url, use it to get json from it.
return this.httpService.getJson(url)
// map the result and flatten it to an array
.flatMap((json: HttpResponse<any>): Array<any> => json.body.values)
// map each value into a more managed model
.map<any, BitbucketModel>((value: any) => {
// create and return BitBucketModel here based on json
})
});
&#13;
我希望我能够很好地解释代码,所以它的本质是我不想使用&#39;订阅&#39;任何地方。因为我使用async管道,我想要一直观察到observables。但是当我使用single()然后我必须flatMap它否则它会给我一个错误,因为我无法返回Observable&lt;可观察到的&lt; BitBucketModel&gt;取代。
修改 如果我没有说清楚我要问的内容,我很抱歉。我的方案是我基本上需要一个配置设置,其中我的实际http请求是基于。所以我必须检索该设置并根据该设置执行该实际的http请求。
答案 0 :(得分:2)
如果我理解正确,你会问为什么flatMap
。让我试着解释一下。
map
同步将输入转换为输出。因此,每个项目都将其转换为其他项目,用新项目替换旧项目。这个过程是同步的。
flatMap
也会替换,但会异步执行。
flatMap
获取一个项目,将其转换为Observable并输出新的Observable蒸汽代替原始项目。
因此可以在这两个实例中使用flatMap
(可能是更多应用程序):
前:
...'string1'... 'string2'... =>
...Output(Observable created from string1)...
...Output(Observable created from string2)...
在你的情况下:
输入:string(url)
输出:来自异步http调用的json。
因此,您必须使用flatMap
。它与single()
在你的例子中:
.flatMap((json: HttpResponse<any>): Array<any> => json.body.values)
这是同步转换。您正在获取一个对象并同步返回另一个对象。所以它不一定是flatMap。你可以说
.map((json: HttpResponse<any>): Array<any> => json.body.values)
实际上,您的代码应该给出错误,因为flatMap
期望Observable
作为返回类型但是您要返回一个对象。