假设我有一个调用类似服务的组件:
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。我该怎么做?
答案 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。