输入'(token:string)=> Observable <{headers:HttpHe aders; }>'不可分配给类型'Observable <any>'

时间:2019-02-18 20:20:20

标签: angular rxjs observable

我一直在阅读rxjs和角度教程,试图了解Observable以及如何将它们链接在一起。根据我已阅读的所有内容,以下代码应该可以工作。但这不是,我也不知道为什么。

我正在尝试从存储中获取令牌(用getFakeToken方法伪造了该部分,因为可以正常编译),然后将该令牌填充到应该封装在可观察对象中的httpHeaders对象中,然后可以将其与另一个对Web服务的调用,并在一天结束时返回该可观察的值(这就是为什么我不使用订阅的原因)。我已经对网络服务进行了最后一次调用(它将使用buildHttpOptions方法中内置的http选项),因为错误在buildHttpOptions行上。

我不确定我是否正确解释了所有内容,因此这是另一种放置方式:我试图异步获取令牌,将该令牌插入httpOptions对象,然后(在以后的代码迭代中) (在return语句的末尾将是另一个“ .pipe()”),使用它来异步调用Web服务并返回包装在可观察对象中的结果。前两个部分(获取令牌并将其插入到对象中)失败了,我将它们包含在下面的代码中。

我收到的错误消息:

[ng] ERROR in src/app/web-api/api.service.ts(57,50): error TS2322: Type '(token: string) => Observable<{ headers: HttpHe
aders; }>' is not assignable to type 'Observable<any>'.
[ng]   Property '_isScalar' is missing in type '(token: string) => Observable<{ headers: HttpHeaders; }>'.
[ng] src/app/web-api/api.service.ts(67,31): error TS2345: Argument of type 'Observable<any>' is not assignable to parame
ter of type 'OperatorFunction<string, any>'.
[ng]   Type 'Observable<any>' provides no match for the signature '(source: Observable<string>): Observable<any>'.

代码:

private getFakeToken(): Observable<string> {
    return of("123abc");
}

getGetData(): Observable<any> {
    let getToken$ = this.getFakeToken();

    let buildHttpOptions$: Observable<any> = (token: string) => { return of(
        {
            headers: new HttpHeaders({
                'Content-Type': 'application/json',
                'authorization': token
            })
        })};

    return getToken$.pipe(buildHttpOptions$);
}

1 个答案:

答案 0 :(得分:1)

您可以使用map运算符将Observable中的对象转换为其他对象。然后使用switchMap链接您的http请求。

getGetData(): Observable<any> {
  return this.getFakeToken().pipe(
    map(token => ({
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'authorization': token
      })
    })),
    switchMap(headers => /* your http request that returns an Observable */)
  );
}