【问题标题】:Angular 2 observe result of httpAngular 2 观察 http 的结果
【发布时间】:2017-02-20 15:31:27
【问题描述】:

这里我有一个服务。它的 signIn 方法将触发另一个返回 Observable 的 Service 的方法。每个组件都应该能够订阅该 Observable 的结果。所以我创建了一个公共响应变量作为 Observable,可以从每个组件访问。我不认为我可以直接订阅登录,因为它需要两个参数,只有一个观察者会真正知道。

问题在于响应开头未定义。所以你不能在另一个组件的构造函数中订阅它。

那么,当我不知道数据何时到达时,如何订阅响应呢?有什么想法吗?

export class AuthService{

    public response:Observable<any[]>;

    constructor(private httpService:HTTPService){
        this.response = new Observable();
    }

    signIn(user:String, password:String){

        this.response = this.httpService.query({user: user, pass: password})
        .map((r: Response) => r.json());

    }
}

这是用户和密码来自的 AuthComponent 方法

onSubmit(f:NgForm){
    this.authService.signIn(f.value.user, f.value.password);
}

【问题讨论】:

  • “数据何时到达”。什么数据? userpassword 来自哪里?
  • @Günter 用户和密码来自组件。数据来自 http get。

标签: angular


【解决方案1】:

通常你应该返回 Observable:

import { BehaviorSubject } from 'rxjs';

export class AuthService {

    public data = new BehaviorSubject<any[]>([]);

    constructor(private httpService: HTTPService) { }

    signIn(user:String, password:String): Observable<any[]> {

        return this.httpService.query({user: user, pass: password})
           .map((r: Response) => r.json())
           .map(data => { this.data.next(data); return data; }); // OPTIONAL if you want to store data in you service..

    }
}

其他组件现在可以订阅该data 主题。

调用组件将订阅并完成。

Http-Request-Observables 在每次请求后完成。

【讨论】:

  • 如果我直接订阅登录,我需要传递用户名和密码。它每次都会触发http get。
  • 查看我的更新答案,所有其他组件现在都可以订阅 data 主题,并且如果任何其他组件登录将收到通知..
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2017-07-23
相关资源
最近更新 更多