在 Angular 2 HTTP 客户端包装器中对 headers 使用承诺

Use promise for headers in Angular 2 HTTP client wrapper

我无法理解如何重构这个 Angular 2 HTTP 包装器,以便我的 header 在请求之前从存储中加载。

我目前正在构造函数中加载 header,但有时在请求发出之前,从存储中检索未完成。到目前为止,我还没有幸运地将 header 编队移动到 promise 但仍然返回 Observable 请求 object。相反,返回了 Promise,我必须使用 then() 才能到达 Observable。

感谢任何指导!

import { Injectable } from '@angular/core';
import { Http, Headers, Response, HTTP_PROVIDERS } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { Storage, SqlStorage } from 'ionic-angular';


@Injectable()
export class HttpClient {
  headers : Headers;

  constructor(private http: Http) {

    this.headers = new Headers({
      'Accept': 'application/json',
      'Content-Type': 'application/json; charset=utf-8'
    })

    // Add auth token to headers
    let storage = new Storage(SqlStorage);

    storage.get("user").then(
      (u) => {
        if(u){
          let user = JSON.parse(u);
          this.headers.append('X-User-Email', user.email);
          this.headers.append('X-User-Token', user.authentication_token);
        }else{
          console.log("User not found in storage.")
        }
      }
    )
  }

  get(url) {
    console.log("GET headers: ", this.headers)

    // I want to add a promise here to load the header data
    // from storage before sending this request.  I still
    // want to return this same Observable http request.

    return this.http.get(url, {
      headers: this.headers
    })
  }
}

编辑

这是我的尝试,returns 'Promise<Observable<Response>>' 而不是 Observable:

import { Injectable } from '@angular/core';
import { Http, Headers, Response, HTTP_PROVIDERS } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { Storage, SqlStorage } from 'ionic-angular';

/*
  A custom wrapper to include headers for API authentication.
  Header info is stored in local storage.
*/

@Injectable()
export class HttpClient {

  constructor(private http: Http) {
  }

  buildHeaders(){
    let headers = new Headers({
      'Accept': 'application/json',
      'Content-Type': 'application/json; charset=utf-8'
    })
    let storage = new Storage(SqlStorage);

    return storage.get("user").then(
      (u) => {
        if(u){
          let user = JSON.parse(u);
          headers.append('X-User-Email', user.email);
          headers.append('X-User-Token', user.authentication_token);
          return headers;
        }
      }
    )
  }

  get(url) {
    return this.buildHeaders().then(
      (headers) => {
        return this.http.get(url, {
          headers: headers
        })
      }
    )
  }
}

调用方收到错误消息:

this.http.get("http://localhost:3000/confirm_auth_token")
.subscribe(
  data => console.log(data)
)

这导致:

Error TS2339: Property 'subscribe' does not exist on type 'Promise<Observable<Response>>'.

我如何 "unwrap" 在 HttpClient 的 get() 方法中承诺?

您的 HttpClient.get 函数正在 return 调用 Promise,因此当 Promise 时您需要 then 来访问 Observable<Response>解决:

this.http
    .get("http://localhost:3000/confirm_auth_token")
    .then((observable) => {
        observable.subscribe((response) => { console.log(response.text()); }); // or response.json() or whatever
    });

如果您想从 get 函数中 return 一个 Observable,您可以像这样重新排列:

get(url) {
    return Observable
        .fromPromise(this.buildHeaders())
        .switchMap((headers) => this.http.get(url, { headers: headers }));
}

您的 get 调用将如下所示:

this.http
    .get("http://localhost:3000/confirm_auth_token")
    .subscribe(response => { console.log(response.text()); }); // or response.json() or whatever