angular – 是否有可能以某种方式同步调用异步离子存储?
发布时间:2020-12-17 17:27:46 所属栏目:安全 来源:网络整理
导读:我正在尝试创建一个在Angular2 HTTP类之上使用API??的类.主要的是我需要添加自定义的auth标头,在用户授权后可用. 主要问题是令牌存储在Ionic Storage模块中,只能异步获取,但我需要返回特定的类型…. export class APIRequest extends Http { private storage
我正在尝试创建一个在Angular2 HTTP类之上使用API??的类.主要的是我需要添加自定义的auth标头,在用户授权后可用.
主要问题是令牌存储在Ionic Storage模块中,只能异步获取,但我需要返回特定的类型…. export class APIRequest extends Http { private storage : Storage; constructor (backend: XHRBackend,options: RequestOptions) { super(backend,options); this.storage = new Storage; } request(url: string|Request,options?: RequestOptionsArgs): Observable<Response> { if (typeof url === 'string') { url = AppConfig.API_SERVER + url } else { url.url = AppConfig.API_SERVER + url.url } this.storage.get('authToken').then(token => { if (typeof url === 'string') { if (!options) { options = {headers: new Headers()}; } options.headers.set('Authorization',`Bearer ${token}`); } else { url.headers.set('Authorization',`Bearer ${token}`); } // Here I need to return },err => { // throw some error }) return super.request(url,options).catch(this.catchAuthError(this)); } } 所以基本上我需要以某种方式将return super.request(url,options)…放到存储的承诺中,并在我获得该令牌时返回. 解决方法
接近重复. (找不到)
至少,答案可以应用于同一个问题.如果你想保留返回的Observable,修复就是将你的Promise(this.storage.get)转换为Observable. 之后,您可以使用像flapMap这样的运算符来返回super.request的值. (注意:编译器不理解它现在返回响应,因此将返回类型更改为Observable< any>(仍将返回Response)) export class APIRequest extends Http { private storage : Storage; constructor (backend: XHRBackend,options); this.storage = new Storage; } // any return type (will return Response object but compiler doesn't understand that) request(url: string|Request,options?: RequestOptionsArgs): Observable<any> { if (typeof url === 'string') { url = AppConfig.API_SERVER + url } else { url.url = AppConfig.API_SERVER + url.url } //convert the Promise to an Observable val storageObservable = Observable.fromPromise(this.sotrage.get('authToken')); // rxjs/add/operator/mergeMap return storageObservable.flatMap(token => { if (typeof url === 'string') { if (!options) { options = {headers: new Headers()}; } options.headers.set('Authorization',`Bearer ${token}`); } // the value that will be returned return super.request(url,options).catch(this.catchAuthError(this)); },err => { // throw some error }) } } 有用的链接: >来自reactivex.io的文档.例如,对于flatMap:http://reactivex.io/documentation/operators/flatmap.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |