在得到我的 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&lt;string&gt;

一旦你依赖一个 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 - 在继续之前等待多个函数调用

如何在调用我的 api 之前减慢/​​等待?

如何在 Rx Observable 上“等待”?

如何在 Swift 上同步或使 Observable 等待?

等到第二个 Observable 发出

如何在订阅前等待 Observable 完成