类型“订阅”缺少以下属性

时间:2019-10-08 06:54:47

标签: angular typescript observable

编写此代码时,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个。”

2 个答案:

答案 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));
}