【问题标题】:Manage loader/spinner for multiple simultaneous async service calls using Angular HTTP interceptor使用 Angular HTTP 拦截器管理多个同时异步服务调用的加载器/微调器
【发布时间】:2020-07-05 22:16:48
【问题描述】:

我已经实现了 Http Interceptor 并在服务启动时显示微调器,并在服务成功/失败时隐藏微调器。

代码示例:

        intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

             return next.handle(req).pipe(
                tap((event: HttpEvent<any>) => {
                    if (event instanceof HttpResponse && event.body.errCode != undefined) {
                        // show_spinner

                    }
                }),
                finalize(()=>{
                    // hide_spinner
             })
         }

例如有两个服务调用同时发生;因此,微调器将显示对应于两个调用,但第一个服务在 2 秒 内完成,第二个服务在 5 秒 内完成;现在微调器将在第一次调用完成后隐藏,将无法确认第二次服务调用。

【问题讨论】:

  • 我建议使用操作符,而不是 Http Interceptor,见stackoverflow.com/questions/60207721/…,否则你需要有一个计数
  • 增加和减少飞行中调用的计数,如果它 > 0 则显示微调器?
  • 你看到SO了吗?运营商适用于订阅-而不是呼叫-。这允许在 forkJoin 或 switchMap 中使用,因此您没有“并发”调用
  • 非常明显@Eliseo 我的目标是不避免调用并发,因为这些调用是异步的;它们可能几乎同时发生,但要找到一个逻辑来确认每个服务调用。
  • 我以为你的目的是在通话结束时显示一个微调器,我个人认为创建一个接线员的想法是最好的解决方案,但这只是个人意见

标签: angular rxjs httprequest interceptor angular-http-interceptors


【解决方案1】:

我想回答我自己的问题,所以可以参考上述问题/问题的解决方案。

首先,声明一个全局变量(初始化为 0)用作活动服务调用的计数器。

其次,对于每个拦截的服务,递增计数(计数器变量),当服务调用完成时,递减计数(计数器变量)。

最后,如果服务计数为零,则隐藏微调器,否则显示微调器。

示例: 定义一个拦截器服务来拦截 HTTP 请求。之后 在拦截器服务中:

service_count = 0; // initialize the counter.

constructor(
    private _route:Router
) {}

intercept(req: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<any>> {

  this.service_count++; // increment the count for each intercepted http request.
  // show spinner.

    return next.handle(req).pipe(
                finalize(() => {
                    this.service_count--;
                 // decrement when service is completed (success/failed both 
                    handled when finalize rxjs operator used)

                    if (this.service_count === 0) {
                        // hide spinner
                    }
                })
            );
}

【讨论】:

  • 我一直在学习这部分,因为根据您的建议,mi forkjoin 现在就像单个调用一样工作,我想打印正在处理的请求、失败的或没有问题的完成是为了调试目的跨度>
猜你喜欢
  • 2020-11-08
  • 1970-01-01
  • 2018-07-08
  • 2020-05-24
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多