.then()永远不会在Observable.toPromise()上调用

时间:2017-06-25 21:26:37

标签: javascript angular typescript

我尝试使用angularfire2身份验证库中的令牌验证我的后端调用。我订阅了authState以获取用户令牌,并将其作为RequestOption添加到我的http请求中。

如果我在chrome调试器中设置断点,它会成功执行getAuthOptions()中的返回行,但在this.getAuthOptions()。toPromise()之后,app既不会调用.then()也不会调用.catch()函数。

Observable用法是否有错误?我可以尝试其他方法吗?

  getPoints(): Promise<Object[]> {
    return this.getAuthOptions().toPromise()
      .then(options => this.http.get(this.baseUrl, options).toPromise())
      .then(_ => _.json().data)
      .catch(console.log);
  }

  getPointsFor(isin: String): Promise<Object> {
    return this.getAuthOptions().toPromise()
      .then(options => this.http.get(this.baseUrl + isin, options).toPromise())
      .then(_ => _.json().data[0])
      .catch(console.log);
  }

  private getAuthOptions(): Observable<RequestOptions> {
    return this.afAuth.authState.map(res => {
      if (res && res.uid) {
        const token = res.getIdToken(true);
        return new RequestOptions({
          headers: new Headers({
            Auth: `${token}`
          })
        });
      } else {
        return new RequestOptions();
      }
    });
  }

1 个答案:

答案 0 :(得分:5)

当{obonable}完成或出错时,toPromise运算符返回的promise将解析。 AngularFire2 authState observable未完成,因此除非发生错误,否则承诺将无法解决。

您可以使用take运算符组成一个observable,它接受第一个发出的身份验证状态,然后完成:

import "rxjs/add/operator/take";

private getAuthOptions(): Observable<RequestOptions> {
  return this.afAuth.authState
    .take(1)
    .map(res => {
      if (res && res.uid) {
        const token = res.getIdToken(true);
        return new RequestOptions({
          headers: new Headers({
            Auth: `${token}`
          })
        });
      } else {
        return new RequestOptions();
      }
    });
}