Angular 未在存储承诺中设置标头

Angular 未在存储承诺中设置标头,angular,typescript,ionic2,Angular,Typescript,Ionic2,我正在尝试向我的api调用添加一个头,但是,我需要获取auth令牌并将其设置为头。但是当我尝试运行下面的代码时,它没有设置它,只设置内容类型 import {HttpClient, HttpHeaders} from '@angular/common/http'; import {Component, Injectable} from '@angular/core'; import { Storage } from "@ionic/storage"; import 'rxjs/add/opera

我正在尝试向我的api调用添加一个头,但是,我需要获取auth令牌并将其设置为头。但是当我尝试运行下面的代码时,它没有设置它,只设置内容类型

import {HttpClient, HttpHeaders} from '@angular/common/http';
import {Component, Injectable} from '@angular/core';
import { Storage } from "@ionic/storage";
import 'rxjs/add/operator/map';

@Injectable()
@Component({
  providers: [HttpClient]
})
export class DataProvider {
  public token:string;

constructor(public http: HttpClient, public storage: Storage) {}

getsomething(){

 let headers = new HttpHeaders();
 headers = headers.set('Content-Type', 'application/json');
 this.storage.get('token').then((val) => {
   this.token = val;
   console.log(this.token);
   headers = headers.set('AuthToken', this.token);
 });

 console.log(headers);

 return this.http.get('http://localhost:54951/getfarms', {
   headers: headers
 });
}函数的header.set()不会返回header实例,因此请执行以下操作

headers = header.set('AuthToken', this.token); //change the line
headers.set('AuthToken', this.token); //do not reassign the headers object

您不能使用在
this.storage.get('token')中设置的值。然后
在调用
之后立即
。承诺不会立即执行处理程序,因为它是一个异步操作

getsomething() {

    let headers = new HttpHeaders();
    headers = headers.set('Content-Type', 'application/json');
    return this.storage.get('token').then((val) => {
        this.token = val;
        console.log(this.token);
        headers = headers.set('AuthToken', this.token);


        console.log(headers);

        return this.http.get('http://localhost:54951/getfarms', {
            headers: headers
        });
    });
}
或者使用异步/等待

async getsomethingAsync() {

    let headers = new HttpHeaders();
    headers = headers.set('Content-Type', 'application/json');
    let val = await this.storage.get('token')
    this.token = val;
    console.log(this.token);
    headers = headers.set('AuthToken', this.token);


    console.log(headers);

    return this.http.get('http://localhost:54951/getfarms', {
        headers: headers
    });
}

您可以尝试使用Observable.flatMap,如下例所示

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Storage } from "@ionic/storage";
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';

@Injectable()
export class DataProvider {
  constructor(public http: HttpClient, public storage: Storage) { }

  getsomething() {
    return Observable.fromPromise(this.storage.get('token')).flatMap((token) => {
      console.log(token);
      let headers = new HttpHeaders();
      headers = headers.set('Content-Type', 'application/json');
      headers = headers.set('AuthToken', token);
      console.log(headers);

      return this.http.get('http://localhost:54951/getfarms', {
        headers: headers
      });
    });
  }
}

你确定吗?代码似乎建议
set
每次都返回一个新的克隆对象,如果您只调用set,而对结果不做任何处理,则不会产生任何效果