返回依赖订阅的可观察对象

时间:2017-02-02 15:32:19

标签: angular

假设我有一个调用类似服务的组件:

this.myCustomerService.getCurrentCustomer().subscribe(customer => {
    console.log(customer);
});

在我的服务中,我有这样的事情:

getCurrentCustomer(): Observable<any> {
    return this.apiService.get(this.hardCodedPath);
}

其中apiService基本上只是抽象一个http.get,并在返回之前对响应做了一些工作。

所以,这完全没问题。这很简单。但现在让我们介绍实际问题。

假设我不能使用&#39; this.hardCodedPath&#39;我需要依赖别的东西。让我们重温一下我服务中的getCurrentCustomer函数:

getCurrentCustomer(): Observable<any> {
    return this.apiService.get(this.path+'/myEndPoint?sessionID='+this.sessionID);
}

问题是this.sessionID可能尚未定义。不用担心,我有一个会话服务可以为我提供:

this.sessionService.getCurrentSession(this.params).subscribe(response => {
    response = JSON.parse(response);
    this.sessionID = response.sessionId;
}

所以那里有螺母和螺栓,但是我如何保证组件调用myCustomerService.getCurrentCustomer()时会设置sessionID?这是一个不起作用的例子:

getCurrentCustomer(): Observable<any> {
    this.sessionService.getCurrentSession(this.params).subscribe(response => {
        response = JSON.parse(response);
        this.sessionID = response.sessionId;
        return this.apiService.get(this.path+'/myEndPoint?sessionID='+this.sessionID);
    }
}

这不会起作用,因为我没有回复任何东西!我也不能简单地返回this.sessionService.getCurrentSession ...因为这将返回订阅,而不是可观察的。

基本上,我需要调用getCurrentCustomer来获取sessionID,等待它,然后调用以获取客户并返回该observable。我该怎么做?

3 个答案:

答案 0 :(得分:0)

我的第一次尝试可能是

getCurrentCustomer(): Observable<any> {
    return this.sessionService.getCurrentSession(this.params).map(response => {
        response = JSON.parse(response);
        return response.sessionId;
    }).flatMap(sessionId => this.apiService.get(this.path+'/myEndPoint?sessionID='+sessionId));
}

答案 1 :(得分:0)

试试这个

getCurrentCustomer(): Observable<any> {
  return this.sessionService.getCurrentSession(this.params)
    .map(response => response.json())
    .map(res => res.sessionId)
    .flatMap(sessionId => this.apiService.get(this.path+'/myEndPoint?sessionID='+sessionId));
}

使用流可读,并且因为http请求的响应可以使用方法.json(),所以不需要JSON.parse()

答案 2 :(得分:0)

Tiep和Victor都发布了一个有效的答案,而flatmap也让我找到了同一解决方案的另一个版本:

getCurrentCustomer(): Observable<any> {
    return this.sessionService.getCurrentSession(this.params).flatMap(response => {
        response = JSON.parse(response);
        this.sessionID = response.sessionId;
        return this.apiService.get(this.path+'/myEndPoint?sessionID='+this.sessionID);
    });
}

看起来基本相同,但似乎我们可以在flatMap中进行映射工作,而不必在map之后链接flatMap。