我无法返回一个观察者。我的代码和错误如下:
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$;
}
调用addNewBook方法的book.component.ts。
...others
return Promise.resolve()
.then(() => {
return bookService.addNewBook(book).toPromise();
}).then((result) => {
console.log(result);
})
我无法真正更改令牌服务,因为它已在其他地方使用,我想将observable转为promise,因此我使用toPromise()
。有没有办法绕过错误?非常感谢!
答案 0 :(得分:2)
我相信你需要使用Rx mergeMap 运算符,并且返回类型可能是错误的(或者你传递给post方法的类型,我会假设返回类型错误但是如果没有你还需要将post方法映射到有效的类型):
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);
});
}
答案 1 :(得分:0)
您应该使用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);
})
)
}