Nik*_*ili 10 observable rxjs angular
我有 HTTP 拦截器。在那个拦截器中,在我更改请求之前,我需要打开一个加载程序。
真正让我担心的是我最终有很多switchMap
s。
为什么?
我在装载机服务中做什么
public showLoader(message) {
return this.translateService.get(message).pipe(
switchMap((translatedMessage) => {
this.loader$ = from(
this.loadingController.create({ message: translatedMessage })
);
return this.loader$.pipe(
switchMap((loader) => {
return from(loader.present());
})
);
})
);
}
Run Code Online (Sandbox Code Playgroud)
在我的拦截器中
public intercept(request: HttpRequest<any>, next: HttpHandler) {
return this.loaderService.showLoader("WAITING").pipe(
take(1),
switchMap( ()=>{
Run Code Online (Sandbox Code Playgroud)
所以已经有 3 个嵌套的switchMap
s。在它下面,我还需要 2 或 3 个switchMap
s(一个用于从存储中获取令牌,另一个用于其他用途)。基本上最终有 5switchMap
秒。
问题:嵌套所有这些switchMap
被认为是一种反模式吗?
可以使用很多,switchMap
特别是当您需要异步行为时,不好的做法是接触数据流之外的东西。
在您的代码中this.loader$
有一个示例,不要使用流外部的变量,而是尝试构建一个在其内部执行您想要的所有操作的管道。
您甚至可以省略from
ifthis.loadingController.create
和loader.present
类似Promise
,switchMap
支持Observable
, Promise
,Array
和Iterator
。
你的代码可能是这样的
public showLoader(message) {
return this.translateService.get(message).pipe(
switchMap(translatedMessage => this.loadingController.create({message: translatedMessage})),
switchMap(loader => loader.present()),
);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1792 次 |
最近记录: |