在得到我的 Observable 之前等待一个 Promise
Posted
技术标签:
【中文标题】在得到我的 Observable 之前等待一个 Promise【英文标题】:Wait for a Promise before to get my Observable 【发布时间】:2018-08-06 13:23:47 【问题描述】:我想使用从存储中获取的令牌执行 Http 请求。 基本上使用同步函数来获取我的令牌,代码如下所示:
import Injectable from '@angular/core';
import Http, XHRBackend, Response, Request, RequestOptions, RequestOptionsArgs, Headers from '@angular/http';
import Observable from 'rxjs/Observable';
import StorageProvider from '../../providers/storage/storage';
@Injectable()
export class SecureHttp extends Http
constructor(backend: XHRBackend, options: RequestOptions,
private store: StorageProvider)
super(backend, options);
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response>
let __token = this.store.getToken();
// ... some verifications ...
options.headers.set('Authorization', `Bearer $__token`);
return super.request(url, options)
我对此很满意.. 但是当我使用异步存储更改我的同步存储访问时..:
public getToken(): Promise<string>
return this.storage.get('token');
和
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response>
this.store.getToken().then((token) =>
options.headers.set('Authorization', `Bearer $token`);
return super.request(url, options)
);
我的编译器说:
[ts] 声明类型既不是“void”也不是“any”的函数必须 返回一个值。
或者
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response>
let __token;
this.store.getToken().then((token) =>
__token = token;
);
options.headers.set('Authorization', `Bearer $__token`);
return super.request(url, options)
请求执行时__token为null。
如何将我的 Promise 集成到我的 Observable 中 :) 谢谢
【问题讨论】:
我现在没有时间整理完整的答案,但也许fromPromise 可能对你有用。 【参考方案1】:
Promise<string>
一旦你依赖一个 Promise 来解决,它就会一直以 Promise 为基础(就像任何其他异步进程一样,例如一直向上回调,一直向上观察)等.
修复
变化:
request(url: string | Request, options?: RequestOptionsArgs):
Observable<Response>
let __token = this.store.getToken();
添加Promise
and async/await
:
async request(url: string | Request, options?: RequestOptionsArgs):
Promise<Observable<Response>>
let __token = await this.store.getToken();
【讨论】:
这是一个扩展类我不能改变这个签名函数..?【参考方案2】:感谢@sam-herrmann 和@than 在这篇帖子中https://***.com/a/48664801/9115215 的fromPromise
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response>
return Observable.fromPromise(this.store.getToken()).concatMap((token) =>
options.headers.set('Authorization', `Bearer $token`);
return super.request(url, options)
)
【讨论】:
以上是关于在得到我的 Observable 之前等待一个 Promise的主要内容,如果未能解决你的问题,请参考以下文章
Angular2 Observable - 在继续之前等待多个函数调用