我正在尝试调用两个可观察量,从第二个开始的响应,作第一个,然后返回一个新的可观察量。
return this.http.get(requestUrl)
.map((response: User) => {
sessionManager.currentUser = response;
return this.isFirstTimeUser(response.id);
})
.do((response: any) => {
console.log(response);
sessionManager.currentUser.firstTimeLogin = response === 'true';
return Observable.create(sessionManager.currentUser);
})
.toPromise();
isFirstTimeUser(response.id( 是另一个返回可观察量的函数。
private isFirstTimeUser(userId: number): Observable<any> {
const requestUrl = 'someUrl';
return this.http.get(requestUrl, {responseType: 'text'});
}
我想做的是从第一个 http 调用中获取用户对象,在第二次调用中使用用户id
发出另一个请求,然后在我从第二个可观察对象返回响应后,我更新第一个响应的属性并返回更新的第一个响应。我如何实现这一点?我应该查看什么 rxjs 函数?
您正在寻找的解决方案是这样的:
getUser(): Observable<any>{
return this.http.get(reqUrl)
.do((res: User) => {
sessionManager.currentUser = res;
})
.switchMap((res: User) => {
return this.isFirstTimeUser(res.id);
})
.do((res: any) => {
console.log(response);
}
.map((res: any) => {
sessionManager.currentUser.firstTimeLogin = res === 'true';
return sessionManager.currentUser;
});
}
然后你只需要订阅getUser()
你应该没事。根据 rxjs 纯函数函数范式,它仍然不是最好的代码。我想使用带有投影函数的concatMap
会让我们更接近理想,但它会起作用。
它不理想的原因是因为在第一个.do()
块中有一个必需的副作用,我们更新sessionManager
值 - 函数外部的变量(在函数世界中是一个很大的禁忌(,然后我们在函数.map()
再次访问它。concatMap
将投影函数作为第二个参数可以解决这个问题。
你在例子中很接近。
您希望使用取消订阅传入可观察量并订阅下一个可观察量switchMap
。
return this.http.get(requestUrl)
.switchMap((response: User) => {
sessionManager.currentUser = response;
return this.isFirstTimeUser(response.id);
})
.map((response: any) => {
console.log(response);
sessionManager.currentUser.firstTimeLogin = response === 'true';
return sessionManager.currentUser;
})
.toPromise();
响应将传递给isFirstTimeuser()
,以下.map()
将应用于该函数返回的可观察对象。
之所以称为switchMap
,是因为this.http.get()
返回的可观察量已取消订阅,并使用下一个可观察量。这对this.http.get()
来说不是问题,但请记住,switchMap
仅适用于第一个发出的值。
使用 mergeMap
return this.http.get(requestUrl)
.mergeMap((response: User) => {
const currentUser = response;
currentUser.firstTimeLogin = this.isFirstTimeUser(response.id) === 'true'
return Observable.of(currentUser);
})