【问题标题】:Type '(token: string) => Observable<{ headers: HttpHe aders; }>' is not assignable to type 'Observable<any>'输入 '(token: string) => Observable<{ headers: HttpHe aders; }>' 不可分配给类型 'Observable<any>'
【发布时间】:2019-07-12 06:43:21
【问题描述】:

我一直在阅读 rxjs 和 Angular 教程,试图了解 Observables 以及如何将它们链接在一起。根据我读过的所有内容,下面的代码应该可以工作。但它没有,我不明白为什么。

我正在尝试从存储中获取一个令牌(使用 getFakeToken 方法伪造该部分,因为这样可以很好地编译),然后将该令牌填充到一个 httpHeaders 对象中,该对象应该包装在一个可观察对象中,然后我可以将其链接在一起再次调用 Web 服务并在一天结束时返回该 observable(这就是我不使用订阅的原因)。我已经取消了对 Web 服务的最后一次调用(将使用 buildHttpOptions 方法中内置的 http 选项),因为错误出现在 buildHttpOptions 行。

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

我收到的错误消息:

[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$);
}

【问题讨论】:

  • 你能不能再解释清楚一点,我不明白你想要做什么?!
  • 让我换一种说法。我试图让这篇文章中的代码编译没有错误。我不明白这个错误。我要求人们解释我做错了什么,为什么我会收到这个错误以及我可以做些什么来解决它。
  • 你能说出这应该起作用的来源吗?通常我将令牌保存在本地存储中,如果它不为空,则尝试检索

标签: angular rxjs observable


【解决方案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 */)
  );
}

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 2019-04-22
    • 2018-08-30
    • 2023-04-10
    • 2017-08-12
    • 2020-05-28
    • 2018-03-09
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多