У меня проблемы с возвратом наблюдаемого. Мои коды и ошибка ниже:
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 и позволить вызывающему коду подписаться (и, следовательно, выполнить запрос).





Я считаю, что вам нужно использовать оператор 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 используется для облегчения чтения, но здесь он просто делает метод более подробным.
Согласно RxJS Version 6 вам обязательно следует использовать оператор pipe.
Согласно ВОЗ? Здесь нет никакого смысла.
.pipe(mergeMap(...)) означает то же, что и .mergeMap(...).
С RxJS версии 6 и Typescript вы не можете использовать .mergeMap(...), вы получите ошибку типа, потому что mergeMap() не существует для типа Observable.
Интересно. Думаю, я слишком долго не работал с js.
Неважно! В Javascript / Typescript все меняется так быстро :)
Почему ваш возвращаемый тип
Observable<Subscription>. Подписка - это просто то, чем вы располагаете, когда закончили наблюдать за наблюдаемым.