(Angular)如何在我的案例中返回一个Observable?

时间:2018-06-18 05:38:31

标签: angular typescript rxjs

我无法返回一个观察者。我的代码和错误如下:

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()。有没有办法绕过错误?非常感谢!

2 个答案:

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