我一直在阅读 rxjs 和 angular 教程,试图了解 Observables 以及如何将它们链接在一起。根据我读过的所有内容,下面的代码应该可以工作。但它没有,我不明白为什么。
我试图从存储中获取一个令牌(用 getFakeToken 方法伪造那部分,因为它编译得很好),然后将该令牌放入一个 httpHeaders 对象中,该对象应该包装在一个 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$);
}
您可以使用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 */)
);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句