我有一个棱角分明的应用程序,我想定期从后端获取数据,并在UI中显示更新.这是我的后端服务:

  // _backendService
  apiDashboardJobs(): Observable<any> {
    return this._httpClient.get<any>(`${environment.apiUrl}/api/dashboard/jobs`);
  }

我的组件代码:

      this.jobsOverview$ = interval(3000)
      .pipe(
        takeUntil(this.destroy$),
        switchMap(response => this._backendService.apiDashboardJobs()),
        map(response => 
          [
            {'status' :'Completed', 'number': response.completed, 'color': 'rgb(94,210,86)'},
            //...
          ]
        ));

    public trackByFn(index, item) {
      return index;
    }

    ngOnDestroy(): void {
      // Unsubscribe and complete the destroy$ subject
      this.destroy$.next();
      this.destroy$.complete();
    }

我的html代码:

                  <tr *ngFor="let job of jobsOverview$ | async; trackBy: trackByFn" style="height: 30px;">
                    <td>
                      <div style.background-color="{{job.color}}"> </div> 
                    </td>
                    <td>
                      {{job.status}}
                    </td>
                    <td>
                      {{job.number}}
                    </td>
                  </tr>

Now, this code seemed to work fine initially, but after some time the table does not render at all anymore and I see a bunch of these errors in the network tab: chrome network tab

有人能指导我如何解决这个问题吗?

推荐答案

我不同意Gilles's comment

好吧,如果它在开始时运行良好,那么我认为问题更多地与您的服务器或直接与您的后端有关.可能存在一些速率限制,这会阻止处理下一个请求

屏幕截图显示请求数为cancelled.取消已完成client side.

查看您的代码,您正在使用一个间隔(每隔3秒)和一个SwitchMap.这意味着,如果您的服务器由于任何原因需要超过3秒才能回复,您的interval的下一个滴答将发生,switchMap将取消正在进行的请求.

如果你把你的switchMap换成exhaustMap,它应该会像预期的那样工作.

编辑:

还要注意的是,为了从一开始就避免背部压力,您可以改进代码以:

  • 立即开始第一个请求.在当前状态下,它等待用户第一次损失的时间为3s
  • 优雅地处理错误并不断重试
  • 再次呼叫您的后端3S after the previous call is done.这与每隔3秒有很大不同,因为它考虑到服务器可能需要一些时间来回复

以下是我会怎么做:

defer(() => this._backendService.apiDashboardJobs())
  .pipe(retry({ delay: 3000 }), repeat({ delay: 3000 }))
  .subscribe(() => console.log('Received answer'));

这是一个现场演示,我还展示了错误是按预期处理的:https://stackblitz.com/edit/rxjs-uah45e?devtoolsheight=60&file=index.ts

Angular相关问答推荐

Goto锚定在嵌套容器中,具有溢出自动

如何在HTML外部项目中使用Web组件(以17角创建)

如何在构造函数中测试MatDialog.Open

存储服务存储在本地存储中,但无法检索到它

如何使用ANGLING HTTP.POST并将类型更改为键入的回复?

使用Angular 13的NgxPrinterService打印时,第二页上的空白区域

如何将角17中的嵌套组件与独立组件一起使用?

Angular 16 Auth Guard在具有0的服务时给出Null Injector错误;httpclient;被注入

我的验证器收到一个始终为空的可观察值

如何检测 Angular Universal 预渲染版本?

如何有条件地更新 Angular 路由解析器数据?

如何更改 Angular material 按钮中的内部 RippleColor 和 UnboundedRipple 效果?

如何将我的数组数据转换为逗号分隔的字符串

rxjs 这种常见的状态管理模式有名称吗?它有限制吗?

Angular 2模板驱动表单访问组件中的ngForm

Angular 5 国际化

Angular 2: Debounce(ngModelChange)?

Angular url加号转换为空格

为什么Angular 12 'ng serve' 构建应用程序的速度很慢?

Angular2 Routerlink:添加查询参数