编写此代码时,IDE显示错误。
我有一个组件,该组件在ngOnInit中调用service以获取数据。服务调用另一个服务来获取一些数据,并使用它来获取数据,然后将其返回。
组件:
ngOnInit() {
const token = "abc";
this.service.getContactPersons(token).subscribe(
persons => this.contactPersons = persons
);
}
服务:
getContactPersons(token: string): Observable<ContactPerson[]> {
return this.tokenService.getParameters(token).pipe(
switchMap((data: Params) => {
return this.http.get<Properties>(
this.baseUrl + `/abc/${data.param1}/properties/${data.param2}`
);
})
).subscribe((data: Properties) => data.contactPersons);
}
我遇到了这个错误:“类型'Subscription'缺少类型'Observable'的以下属性:_isScalar,源,运算符,提升和另外6个。”
答案 0 :(得分:1)
您的函数import de.codecentric.boot.admin.server.config.EnableAdminServer;
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
将返回当前的订阅。
只需删除函数的getContactPersons
部分,它就可以解决问题。
由于您将要返回一个Observable,因此您应始终尝试仅传递Observable本身或在.subscribe((data: Properties) => data.contactPersons);
内对其进行操作,并且仅订阅一次,因为多个订阅可能会失控并且导致内存泄漏,从而导致用户性能下降。
答案 1 :(得分:1)
subscribe
不是与then
等效的rxjs。具体来说,有了诺言,您可以somePromise.then(doSomething).then(doSomethingElse)
,但不能someRxjsStream$.subscribe(doSomething).subscribe(doSomethingElse)
。如果要转换数据流,则应使用几种可用的rxjs运算符之一,在您的情况下为map
:
getContactPersons(token: string): Observable<ContactPerson[]> {
return this.tokenService.getParameters(token).pipe(
switchMap((data: Params) => this.http.get<Properties>(
`${this.baseUrl}/abc/${data.param1}/properties/${data.param2}`)),
map((data: Properties) => data.contactPersons));
}