【问题标题】:Angular 6 - How to get value from callback of async function in another async function in the right way?Angular 6 - 如何以正确的方式从另一个异步函数中的异步函数回调中获取价值?
【发布时间】:2019-01-22 21:01:12
【问题描述】:

我有以下 HTTP 提供程序,它使用 subscribe 方法调用,如下例所示。问题是,在 GET 请求期间,我需要获取保存在本地存储中的令牌值,这是使用 HTTP 提供程序中函数 getToken 中的另一个提供程序发生的。我无法在 HTTP 调用中获取令牌值。我想问一下,请问如何以正确的方式进行?

感谢您的任何建议。

this.httpProvider.doGetRequest(Constants.API_SERVER_URL+Constants.API_ENDPOINT_THREADS)
      .subscribe(res => {
        console.log(res);
        this.loading.dismiss();
      }, (error) => {
        console.log(error);
        this.err = error;
        this.loading.dismiss();
        this.presentToast();
      });

HTTP 提供程序类:

@Injectable()
export class HttpProvider {

  constructor(public http: HttpClient,
              public dataProvider: DataProvider,
              public locStor: LocalStorageProvider) {
    console.log('Hello HttpProvider Provider');
  }

  public doGetRequest(url: string) {
    return this.http.get(url, this.getHeaders());
  }

  public doPostRequest(url: string, params: any) {
    return this.http.post(url, params);
  }

  public getHeaders() {
    return {
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Authorization': 'Bearer test',
        'token': this.getToken()
      },
      params: new HttpParams()
    };
  }

  private getToken() {

    this.locStor.getValue(Constants.LS_KEY_USER_TOKEN).then((val) => {
      return val;
    });
    //return this.locStor.getValue(Constants.LS_KEY_USER_TOKEN);
    //return '222';
    //return this.dataProvider.getUser().token;
  }

}

更新版本

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import {HttpHeaders} from "@angular/common/http";
import {LocalStorageProvider} from "../local-storage/local-storage";
import {Constants} from "../../app/constants";
import {Headers} from "@angular/http";
import {HttpParams} from "@angular/common/http";
import {DataProvider} from "../data/data";
import 'rxjs/add/observable/fromPromise';
import { Observable } from 'rxjs/Observable';
import {FromObservable} from "rxjs-compat/observable/FromObservable";
import {PromiseObservable} from "rxjs-compat/observable/PromiseObservable";


/*
  Generated class for the HttpProvider provider.

  See https://angular.io/guide/dependency-injection for more info on providers
  and Angular DI.
*/
@Injectable()
export class HttpProvider {

  constructor(public http: HttpClient,
              public dataProvider: DataProvider,
              public locStor: LocalStorageProvider) {
    console.log('Hello HttpProvider Provider');
  }

  public doGetRequest(url: string) {
    //return this.http.get(url);

    return Observable.fromPromise((this.getHeaders()).flatMap((headers) => {
      this.http.get(url, headers);
    }));

  }

  public doPostRequest(url: string, params: any) {
    return this.http.post(url, params);
  }

  public getHeaders() {
    /*
    return {
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Authorization': 'Bearer test',
        'token': this.getToken
      },
      params: new HttpParams()
    };
    */

    return this.locStor.getValue(Constants.LS_KEY_USER_TOKEN).then((val) => {
      return {
        headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/json',
          'Authorization': 'Bearer test',
          'token': val
        },
        params: new HttpParams()
      };
    });

  }

  private getToken() {
    this.locStor.getValue(Constants.LS_KEY_USER_TOKEN);
    /*
    this.locStor.getValue(Constants.LS_KEY_USER_TOKEN).then((val) => {
      return val;
    });
    */
    //return this.locStor.getValue(Constants.LS_KEY_USER_TOKEN);
    return '222';
    //return this.dataProvider.getUser().token;
  }

}

【问题讨论】:

    标签: typescript promise angular6


    【解决方案1】:

    我会这样做:

    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/observable/fromPromise';
    import 'rxjs/add/operator/mergeMap'; 
    
    @Injectable()
    export class HttpProvider {
    
      constructor(public http: HttpClient,
                  public dataProvider: DataProvider,
                  public locStor: LocalStorageProvider) {
        console.log('Hello HttpProvider Provider');
      }
    
      public doGetRequest(url: string) {
        return Observable.fromPromise(this.getHeaders()).flatMap((headers) => {
          this.http.get(url, headers);
        });
      }
    
      public doPostRequest(url: string, params: any) {
        return this.http.post(url, params);
      }
    
      public getHeaders() {
        return getToken()
          .then((token) => ({
            headers: {
              'Content-Type': 'application/json',
              'Accept': 'application/json',
              'Authorization': 'Bearer test',
              'token': token,
            },
            params: new HttpParams()
          });
      }
    
      private getToken() {
        this.locStor.getValue(Constants.LS_KEY_USER_TOKEN)
      }
    
    }
    

    【讨论】:

    • from 返回“不是函数”异常。导入类的命名空间是否可能已重命名?我正在使用 Angular 和 Ionic 3。 from(this.getHeaders()).flatMap((headers) => {
    • 哦,那您可以尝试导入import { Observable } from 'rxjs/Observable'; 并用return Observable.fromPromise 替换return from 吗?
    • 更改后我得到:错误类型错误:WEBPACK_IMPORTED_MODULE_5_rxjs_Observable.Observable.fromPromise 不是一个函数没有 rxjs 可以做到这一点或提供一些教程的链接吗?我找到了版本的迁移指南。 6、但是有很多替换from:见github.com/reactivex/rxjs/blob/HEAD/docs_app/content/guide/v6/…
    • 您可以尝试在Observable import 上方添加import 'rxjs/add/observable/fromPromise'; 这一行吗?看起来很像github.com/zyra/ionic-image-loader/issues/166
    • 现在它返回 core.js:1449 ERROR TypeError: this.getHeaders(...).flatMap is not a function I added the second version of class into question.
    猜你喜欢
    • 2019-07-03
    • 2021-02-20
    • 1970-01-01
    • 2016-05-22
    • 2020-09-18
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多