Возврат подписки из Сервиса - но как использовать асинхронный результат также в Сервисе? - PullRequest
0 голосов
/ 04 апреля 2019

Извините за плохой заголовок, я действительно не знал, как его сформулировать.

Предположим, у меня есть вызов службы где-то в компоненте Angular, например:

this.myService.postObject(object).subscribe((serverData) => {
  console.log('Server Name:' + serverData.name)
});

Это прекрасно работает, когда MyService выглядит так:

postObject(dataObject: MyObject) {
  return this.http.post(`http://server/object`, dataObject);
}

Но что, когда я захочу отреагировать на асинхронность, получится не только индивидуально только в подписках, но и, как правило, вообще для всех вызовов - так в идеале так:

postObject(dataObject: MyObject) {
  return this.http.post(`http://server/object`, dataObject)
    .subscribe(
      (serverData) => {
        console.log('Server Name:' + serverData.name)
      })
}

Это, конечно, не работает, так как я не могу вернуть подписку, а затем снова подписаться на нее.

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

Есть ли способ достичь этого или я просто слеп, чтобы увидеть? : - (

1 Ответ

2 голосов
/ 04 апреля 2019

Это то, для чего tap , tap не изменит вашу возвращаемую наблюдаемую, но может позаботиться о таких вещах, как регистрация. Если вы хотите изменить возвращаемую Obsertvable, используйте map вместо

postObject(dataObject: MyObject) {
  return this.http.post(`http://server/object`, dataObject)
    .pipe(tap(serverData => {
        console.log('Server Name:' + serverData.name)
      }))
}

Оператор отвода RxJS (как в «прослушке») позволяет коду проверять правильные значения и значения ошибок, проходящие через наблюдаемое, не нарушая их.

https://angular.io/guide/http

...