RXJS:返回外部可观察值的操纵值



我正在尝试调用两个可观察量,从第二个开始的响应,作第一个,然后返回一个新的可观察量。

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);
})

最新更新