(Angular) Как вернуть Observable в моем случае?

У меня проблемы с возвратом наблюдаемого. Мои коды и ошибка ниже:

Type 'Subscription' is not assignable to type 'Observable<Subscription>'

Коды:

book.service.ts

import {HttpClient, HttpHeaders} from '@angular/common/http';

export class bookService {
    constructor(
        private http: HttpClient,
        ...others
    ) {}

addNewBook(book): Observable<Subscription>{
     ####### tokenService.getToken() outputs the above error. 
    return this.tokenService.getToken().subscribe((token: string) => { 
        const myUrl = "www.testurl.com";
        const parameters = {
            bookTitle: book.name,
        };

        return this.http.post<Book>(myUrl, book);

    })
}

token.service.ts

public token$: Subject<string>;

..others

public getToken(): Observable<string> {
    return this.token$;
}

book.component.ts, вызывающий метод addNewBook.

...others
    return Promise.resolve()
         .then(() => {
              return bookService.addNewBook(book).toPromise();         
         }).then((result) => {
             console.info(result); 
         })

Я не могу изменить службу токенов, потому что она используется в другом месте, я хочу превратить наблюдаемое в обещание, поэтому я использую toPromise(). Есть ли способ обойти ошибку? Большое спасибо!

Почему ваш возвращаемый тип Observable<Subscription>. Подписка - это просто то, чем вы располагаете, когда закончили наблюдать за наблюдаемым.

cwharris 18.06.2018 07:41

хм. что мне тогда использовать?

GeekSquard 18.06.2018 07:50

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

cwharris 18.06.2018 08:02
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю, что вам нужно использовать оператор Rx mergeMap, и тип возврата может быть неправильным (или тип, который вы передаете методу публикации, я предполагаю, что тип возврата неверен, но если нет, вам также нужно сопоставить метод публикации с действительным тип):

addNewBook(book): Observable<Book> {
    return this.tokenService.getToken().mergeMap((token: string) => { 
        const myUrl = "www.testurl.com";
        const parameters = {
            bookTitle: book.name,
        };

        return this.http.post<Book>(myUrl, book);

    });
}

Для обработки подписки внутри mergeMap следует использовать оператор observable.

addNewBook(book): Observable<Book>{
    return this.tokenService.getToken().pipe(
      mergeMap((token: string) => {
        const myUrl = "www.testurl.com";
        const parameters = {
            bookTitle: book.name,
        };
        return this.http.post<Book>(myUrl, book);
      })
   )
 }
pipe используется для облегчения чтения, но здесь он просто делает метод более подробным.
cwharris 18.06.2018 08:11

Согласно RxJS Version 6 вам обязательно следует использовать оператор pipe.

SplitterAlex 18.06.2018 08:22

Согласно ВОЗ? Здесь нет никакого смысла.

cwharris 18.06.2018 08:23
.pipe(mergeMap(...)) означает то же, что и .mergeMap(...).
cwharris 18.06.2018 08:24

С RxJS версии 6 и Typescript вы не можете использовать .mergeMap(...), вы получите ошибку типа, потому что mergeMap() не существует для типа Observable.

SplitterAlex 18.06.2018 08:30

Интересно. Думаю, я слишком долго не работал с js.

cwharris 18.06.2018 08:35

Неважно! В Javascript / Typescript все меняется так быстро :)

SplitterAlex 18.06.2018 08:50

Другие вопросы по теме