我得到了一个firebase auth函数返回的承诺,我需要idtoken通过api进行授权。
我正在用一个可观察的设置http get-req。
当我运行代码的时候,我会得到一个“未经授权的401”。
我尝试在getdata函数之外运行getidtoken,尽管idtoken在控制台中保持“未定义”。
See this image of the console "undefined" message
我该如何解决这个问题?
服务:

    import { Component, OnInit, Inject, Injectable } from '@angular/core';
    import { HttpHeaders, HttpParams } from '@angular/common/http';
    import { HttpModule, Http, Response, RequestOptions } from "@angular/http";
    import * as firebase from 'firebase/app'; //Firebase SDK
    import { Observable } from "rxjs/Observable";
    import 'rxjs/Rx';
    import { AngularFireDatabase, FirebaseListObservable } from "angularfire2/database";
    import { Params } from "@angular/router/src";
    import { Headers } from '@angular/http';

    @Injectable()
    export class StoriesService implements OnInit {

      page: string;
      feed: string;
      hits: string;
      idToken: any;

      private stories: any;
      private savedObjects: any;
      private apiUrl = 'https://dev-api.byrd.news/v1/stories';


       constructor(private http: Http) {
    console.log("Yo! Stories!")
  }

  ngOnInit() { }

  fireAuth() {
    firebase.auth().currentUser.getIdToken(true).then((idToken) => {
      this.idToken = idToken;
    })
  }


  getData(page, feed, hits): Observable<any> {
    this.fireAuth();
    let headers = new Headers();
    headers.append('user_token', this.idToken);
    let params = new HttpParams()
      .set('page', page)
      .set('feed', feed)
      .set('hits', hits)
    //let options = new RequestOptionsArg({headers: headers, params:params});
    console.log(this.idToken, headers, params);
    return this.http
      .get(this.apiUrl, { params, headers })
      .map((response: Response) => {
        console.log("Breakthrough!")
        return response.json() || {};
      })
      .catch(this.handleError);
  }

  private handleError(error: Response) {
    return Observable.throw(error.statusText);
  }

组成部分:
 getStories() : void {
    this.storiesService.getData('0', 'latest','6')
    .subscribe(data => {
      console.log(data);
    })
  }
}

最佳答案

这在某种程度上适用于.flatmap()函数:

export class StoriesService implements OnInit {

  private apiUrl = 'https://dev-api.byrd.news/v1/stories';

  constructor(private http: Http) {
    console.log("Yo! Stories!")
  }

  ngOnInit() { }

  getToken() {
    return Observable.fromPromise(firebase.auth().currentUser.getIdToken(true)
      .then((idToken) => {
        return idToken;
      }))
  }


  getData(page: string, feed: string, hits: string): Observable<any> {
    return this.getToken()
      .flatMap(idToken => {
        let headers = new Headers();
        headers.append('user_token', idToken);
        let params = new URLSearchParams();
          params.append('page', page);
          params.append('feed', feed);
          params.append('hits', hits);
        let options = new RequestOptions({ headers: headers, params: params });
        // console.log(this.idToken, options);
        console.log("Token: " + idToken);
        console.log(headers, params);
        return this.http
          .get(this.apiUrl, { params, headers })
          .map((response: Response) => {
            console.log("Breakthrough!")
            return response.json() || {};
          })
      })
      .catch(this.handleError);
  }

  private handleError(error: Response) {
    return Observable.throw(error.statusText);
  }

09-30 22:35