Тип «Подписка» отсутствует следующие свойства - PullRequest
0 голосов
/ 08 октября 2019

IDE показывает ошибку, когда я пишу этот код.

У меня есть компонент, который вызывает службу в ngOnInit для получения данных. Служба вызывает другую службу, чтобы получить некоторые данные и использовать их для получения данных, а затем возвращает их.

компонент:

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

Я имеюполучена эта ошибка: «Типу« Подписка »не хватает следующих свойств из типа« Наблюдаемый »: _isScalar, источник, оператор, лифт и еще 6».

Ответы [ 2 ]

1 голос
/ 08 октября 2019

subscribe не является эквивалентом * rxjs then. В частности, с обещаниями вы можете выполнить 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));
}
1 голос
/ 08 октября 2019

ваша функция getContactPersons возвращает подписки, как сейчас. просто удалите часть .subscribe((data: Properties) => data.contactPersons); вашей функции, и она должна сделать свое дело.

Поскольку вы собираетесь вернуть наблюдаемую информацию, вы должны всегда пытаться просто передать наблюдаемую саму или выполнить операции с ней в течение pipe() и подписаться на нее только один раз, поскольку множественная подписка может выйти из-под контроля. и приводит к утечке памяти и, следовательно, к потере производительности для ваших пользователей.

...