[英]Chaining observables Angular 5 / Rxjs
我对rxjs运算符有点困惑。 我很少返回可见的api调用:
getCurrentUser(): Observable<any> {
return this.http.get<any>(userUrl);
}
tagsList(): Observable<string[]> {
return this.http.get<string[]>(tagsUrl);
}
timezonesList(): Observable<Timezone[]> {
return this.http.get<Timezone[]>(timezonesUrl);
}
我想先调用getCurrentUser()
然后返回值,然后调用操作LoadUser(user)
返回结果,然后在用户加载后同时调用多个异步请求:
tagsList(), timezonesList()
然后,根据返回值的结果,调用操作LoadTags(tags), LoadTimezones(timezones)
所以它看起来应该像这样:
init() {
this.accountsApi.getCurrentUser()
.map((user: User) => this.store.dispatch(new LoadUser({ user })))
.map(
this.commonApi.tagsList(),
this.commonApi.timezonesList(),
this.commonApi.authoriztionServicesList()
)
.map((tags, timezones, authorizationServices) => {
this.store.dispatch(new tagsActions.LoadTags(tags));
this.store.dispatch(new timezonesActions.LoadTimezones(timezones));
this.store.dispatch(new authorizationServicesActions.LoadAuthorizationServices(authorizationServices));
});
}
我知道这个运算符是错误的。 我应该使用什么运算符? 我已经用诺言做到了,但是我确信我可以用更少的代码行就可以用rxjs运算符来做到这一点。
PS也对我来说很有趣,我如何用异步/等待呢? 谢谢
在原始代码中,您使用了map太多了,对于某些用例,可能不需要映射。
init() {
return this.accountsApi.getCurrentUser()
.do((user: User) => this.store.dispatch(new LoadUser({ user })))
.forkJoin(
this.commonApi.tagsList(),
this.commonApi.timezonesList(),
this.commonApi.authoriztionServicesList()
)
.do((results) => {
this.store.dispatch(new tagsActions.LoadTags(results[0]));
this.store.dispatch(new timezonesActions.LoadTimezones(results[1]));
this.store.dispatch(new authorizationServicesActions.LoadAuthorizationServices(results[2]));
});
}
forkJoin使您可以触发许多可观察的订阅,并且一旦所有订阅产生了值,您就可以返回一个可观察值的数组。
由于您不想创建任何数组,所以do运算符会引入副作用来启动您的商店操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.