[英]Make nested HTTP calls from a Service Class and return Observable
I need to make two dependent HTTP calls from my Service Class in Angular 5 and return an Observable so that my component can subscribe to it.我需要从 Angular 5 中的服务类进行两个相关的 HTTP 调用并返回一个 Observable,以便我的组件可以订阅它。 So inside the Service Class function:
所以在服务类函数内部:
string
string
类型string
will be used by HTTP call 2 as inputstring
将被 HTTP 调用 2 用作输入string[]
string[]
Observable<string[]>
Observable<string[]>
Code that is not working (error: function must return a value):不工作的代码(错误:函数必须返回一个值):
getData(): Observable<string[]> {
this.httpClient.get<string>('service1/getData').subscribe(
dataFromSvc1 => {
return this.httpClient.get<string[]>('service2/getData/' + dataFromSvc1);
},
err => {
return throwError(err);
}
)
}
Try switchMap, something like this (NOT TESTED or syntax checked!):试试switchMap,像这样(未测试或语法检查!):
getData(): Observable<string[]> {
return this.httpClient.get<string>('service1/getData')
.pipe(
switchMap(dataFromSvc1 => {
return this.httpClient.get<string[]>('service2/getData/' + dataFromSvc1);
}),
catchError(this.someErrorHandler)
);
}
The subscription then goes in the component calling this method.然后订阅进入调用此方法的组件。
Let me know if this works.让我知道这个是否奏效。
mergeMap or switchMap can be used in case of nested calls to get a single Observable as response.在嵌套调用的情况下可以使用mergeMap或switchMap来获取单个 Observable 作为响应。
getData(): Observable<string[]> {
return this.httpClient.get<string>('service1/getData').pipe(
mergeMap( (dataFromSvc1) => {
return this.httpClient.get<string[]>('service2/getData/' + dataFromSvc1);
}),
catchError( (err) => {
// handle error scenario
}
)
}
Find the below article to check example code snippets for both Service and Component and step by step explanation of what happens when executed.查找以下文章以检查服务和组件的示例代码片段,并逐步说明执行时会发生什么。
https://www.codeforeach.com/angular/angular-example-to-handle-nested-http-calls-in-service https://www.codeforeach.com/angular/angular-example-to-handle-nested-http-calls-in-service
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.