Angular 4 - 如何从另一个http请求中的http请求同步获取值?

2024-05-25

我在我的客户端应用程序中使用 Angular 4。

customer.service 中的 getCustomer() 函数调用 API 来获取数据。这个函数是可观察的。

此函数需要访问令牌才能调用 API。访问令牌可以通过 auth.service 中的 getAccessToken() 函数获取。

但 getAccessToen() 是异步的。我们如何从 async 函数中获取值?

请注意,getCustomer() 必须是可观察的,以便我可以将响应中的数据映射并绑定到 customer.component 的成员。

auth.service.ts

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class AuthService {
    private tokenEndpoint = "http://localhost:9000/connect/token";
    private clientId = "testclientid";
    private clientSecret = "testsecret";

    constructor(private http: Http) { }

    getAccessToken() : Observable<any> {
        let credential = "Basic " + btoa(`${this.clientId}:${this.clientSecret}`);
        let body = "grant_type=client_credentials&scope=testscope";
        let headers = new Headers();
        headers.set("Content-Type", "application/x-www-form-urlencoded");
        headers.set("Authorization", credential);   

        return this.http.post(this.tokenEndpoint, body, { headers: headers })
            .map(result => {
                let data = result.json();
                return data.access_token || "";
            });                     
    }
}

客户服务.ts

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

import { Customer } from './customer';
import { Address } from './customer';
import { ResourceData } from './customer';
import { ResourceAttributes } from './customer';
import { CustomerResource } from './customer';
import { ResourceCollection } from './customer';
import { AuthService } from '../auth/auth.service';

@Injectable()
export class CustomerService {
    private customersUrl = "http://localhost:60001/api/v1/customers";

    constructor(private http: Http, private authService: AuthService) { }
    
    getCustomer(id: string): Observable<CustomerResource> {
		let accessToken = this.authService.getAccessToken().subcribe(
			// how to get accessToken from authService because subcribe is async?
		); 
		
		let headers = addAccessTokenToHeader(accessToken);
	
        let url = `${this.customersUrl}/${id}`;
        return this.http.get(url, { headers: headers })
            .map(result => {                
                return result.json() as CustomerResource;
            })
            .catch((error) => {
                console.log(error);
                return Observable.throw(error);
            });
    }    

	private addAccessTokenToHeader(accessToken: string): Headers {
        let headers = new Headers();
        headers.set("Authorization", `Bearer ${accessToken}`);

        return headers;
    }
}

客户详细信息.component.ts

showCustomer(id: string) {
    this.modalTitle = "Update PL customer";
    this.buttonSaveTitle = "Update";
    this.customerService.getCustomer(id)
        .subscribe(customer => {
            this.mapFromResource(customer.data);
            this.customerModal.show();
        });
}

private mapFromResource(data: ResourceData) {
    this.customerId = data.id;
    this.reference = data.attributes.reference;
    this.lastName = data.attributes.lastName;
    this.middleName = data.attributes.middleName;
    this.firstName = data.attributes.firstName;
}

// this.customerId, this.reference are the members of customer.component. They are binding on UI.

从我的头顶,在你的customer.service.ts您可以使用如下方式链接方法调用:

getCustomer(id: string): Observable<CustomerResource> {
  this.authService.getAccessToken()
    .map((accessToken) => { 
      let headers = addAccessTokenToHeader(accessToken);

      let url = `${this.customersUrl}/${id}`;
      return this.http.get(url, { headers: headers })
        // rest of the code
      }); 

如果不起作用,请尝试更换.map with .switchMap.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 4 - 如何从另一个http请求中的http请求同步获取值? 的相关文章

随机推荐

  • 稀疏向量模板类:如何清理它?

    我不确定这是否是一个好问题 如果不是 请关闭它 我开始写 使用boost coordinate vector作为起点 sparse vector有效实现类似向量接口的模板类 但很稀疏 它实现了所有常见的向量运算和一个迭代集合元素的快速稀疏迭
  • Flutter 屏幕变化回调

    我想在屏幕更改时收到回调 这样我就可以停止在该特定屏幕上运行的重复请求 dispose 仅在使用 Navigator pop 时调用 而在调用 Navigator push 时不调用 有没有办法检测到屏幕已更改且当前未显示 在您的 Mate
  • Javascript 中的无限原型继承

    我正在学习 Javascript 中的原型继承 根据我的理解 我尝试使用它来将进程发送到无限递归链接中 我对原型继承的想法是一个对象 它是一个函数 保存原型链接 该对象的任何实例都指向它 因此 如果我说instance someproper
  • Python 如果 kwargs 中的 key 并且 key 为 true

    if force in kwargs and kwargs force is True 感觉应该有更好的方法来编写这个条件 因为我重复了键和变量 假设您确实想检查返回的关键字参数是否is True 这是另一种稍微不同的方式 if kwarg
  • 获取 const 引用的迭代器

    我正在开发一个必须返回一个迭代器的类begin 方法 另外 我必须开发一个函数来接收此类的 const 引用并对其进行迭代 当我尝试从此方法获取迭代器时 出现以下编译错误 the object has type qualifiers tha
  • Express MongoDB find() 基于 _id 字段

    因此 在我的 Express 应用程序中 我尝试根据我的 id 字段查找 请参阅下面我的 MongoDB 记录 id oid 58c2a5bdf36d281631b3714a title EntertheBadJah subTitle Lo
  • NoSQL(MongoDB)与 Lucene(或 Solr)作为数据库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着基于文档数据库的 NoSQL 运动的发展 我最近关注了 MongoDB 我注意到如何将项目视为 文档 就像 Lucene 以及 Solr 用
  • 使用 Swift 的核心数据瞬态值

    有谁知道 或者有一个例子 如何使用 Swift 处理核心数据瞬态值 我知道在属性之前使用 NSManaged 但无法弄清楚如何编写逻辑以使用 Swift 构建瞬态值 复选标记短暂的数据模型中特定属性的字段 例如sectionTitle 为该
  • 将分页库从 3.0.0-alpha10 更新到 3.0.0-alpha12 时出现运行时错误

    我使用 paging 3 0 0 alpha10 创建了我的 pagingSource 类并且它有效 但是当我将版本更改为 3 0 0 alpha12 时 我收到这个错误 这是运行时异常 java lang AbstractMethodEr
  • 在 Win32 C# WPF 应用程序中使用 UWP C++ dll

    我正在尝试使用 Microsoft 在 Win32 C WPF 应用程序内的 UWP 示例之一中提供的 SimpleCommunication C DLL https github com Microsoft Windows univers
  • 如何在 Qt-Creator 中添加自定义构建步骤?

    构建我的应用程序后 我想将其复制到特定目录 在 Windows 7 上 自定义构建步骤 cmd exe c k copy MyPlugin dll HostApp Debug plugins 但我有错误 Can t run process
  • 将自定义参数传递给登录页面 Identity Server 4 中使用的 returnUrl

    我正在使用 IdentityServer4 为使用混合流的客户端实现身份验证服务器 我成功地实现了自己的用户存储以及自己的客户 赠款和资源存储库 当用户想要登录时 客户端会将其重定向到我的身份验证服务器 如果未登录 则会显示登录页面 此时
  • 讨论iPhone上的MVC实现

    我在不同的框架上使用 MVC 模式一段时间 例如 swing android gwt 现在 我正在学习iPhone框架 我对MVC的实现感到非常惊讶 我问的问题是关于视图和控制器交互的 首先 这就是我构思 MVC 模式的方式 视图和控制器通
  • Kafka Connect Confluence S3 Sink 连接器:找不到类 io.confluence.connect.avro.AvroConverter

    使用此 Kafka Connect 连接器 https www confluence io hub confluenceinc kafka connect s3 https www confluent io hub confluentinc
  • iOS) 照片扩展无法保存更改问题

    我正在制作照片扩展 但是当我尝试保存更改时 点击 完成 按钮 警报消息显示 无法保存更改 发生错误 节省的同时 请稍后再试 这是我的代码finishContentEditingWithCompletionHandler completion
  • 如何监听自定义 URI

    我正在开发一个有自己的 URI 前缀的应用程序 在本例中为 dchub 到处搜索并阅读了很多 但我有点困惑 当有人点击以以下开头的链接时 是否可以启动我的应用程序dchub 在浏览器中 到目前为止 找到了很多从应用程序打开浏览器的其他示例
  • python类型中的__flags__有什么用

    我最近阅读了pickle源代码 以下代码在copy reg让我很困惑 HEAPTYPE 1 lt lt 9 def reduce ex self proto assert proto lt 2 for base in self class
  • Corda FlowTest 设置中具有两个未使用状态的 LinearState

    我正在尝试为具有 LinearState 的流编写 FlowTest 在设置中 我需要创建一个 LinearState 然后通过在第二个事务中使用第一个版本来创建该状态的第二个版本 具有相同的唯一标识符 我按照以下步骤操作the v2 0
  • 用于 Eclipse PDT 的 Zend 框架插件

    我安装了 eclipse PDT IDE 版本 1 2 0 我将它与 Dojo 一起使用来开发非常有趣的 Ajax 应用程序 现在我想在我的 eclipse IDE 中启用 Zend 框架 我怎样才能做到这一点 经过一番谷歌搜索后 我尝试了
  • Angular 4 - 如何从另一个http请求中的http请求同步获取值?

    我在我的客户端应用程序中使用 Angular 4 customer service 中的 getCustomer 函数调用 API 来获取数据 这个函数是可观察的 此函数需要访问令牌才能调用 API 访问令牌可以通过 auth servic