为啥我的 UI 会冻结,直到 api 调用终止?

Posted

技术标签:

【中文标题】为啥我的 UI 会冻结,直到 api 调用终止?【英文标题】:Why does my UI freeze until the api call is terminated?为什么我的 UI 会冻结,直到 api 调用终止? 【发布时间】:2021-11-17 07:30:44 【问题描述】:

我有一个 API 调用可以下载所有意大利城市,将近 8000 个。 问题是页面加载了 html,但在 API 调用结束之前我无法单击任何内容。

ngAfterViewInit()
    this.loadComuni();

loadComuni()
   //Italian municipalities
   this.RegisterService.getMunicipalities().subscribe(
      obj=>
        this.city=obj;
      ,
      error=>
        console.log("error", error);
   );



<div class="col-12 col-lg-4"">
 <select id="cbComNasc" class="form-control" formControlName="cbComNasc">
      <option *ngFor="let c of city" [ngValue]="c.citta">c.citta</option>
 </select>
</div>



//getMunicipalities
  public getMunicipalities():Observable<Comuni[]>
    const httpOptions = 
      headers: new HttpHeaders(
        "Content-Type": "application/json; charset=UTF-8",
        'Accept':  'application/json'
      )
    ; 
    return this.HttpClient.get<Comuni[]>(environment.apiURL+"api/v1/gestionale/GetComuni",httpOptions)
  

我也尝试了异步管道或承诺,但问题是一样的。

【问题讨论】:

您能否在您的RegisterService 下添加getMunicipalities 的代码? @codeitup 我已经更新了问题,所以你可以看到服务调用。 嗯,我在服务方法中也没有看到任何问题,不确定是什么原因造成的,寻找其他原因,因为 Http 调用本质上是异步的,所以它们永远不会阻塞你的 UI。 @codeitup 我从 F12-> Network 看到调用 api 需要 800 毫秒的响应时间;并且该页面在通话结束之前不是空闲的。 使用ngOnInit 代替ngAfterViewInit 方法。也许修复了! 【参考方案1】:

我也有同样的issue。如果您有大量数据,ngFor 将需要一些时间来呈现它们,所以有一个单独的数组并最初呈现 10 到 20 条记录,如果用户滚动到底部,则呈现 10 t0 更多或具有分页功能。

【讨论】:

我并没有完全像那样修复它,但感谢它帮助我的想法

以上是关于为啥我的 UI 会冻结,直到 api 调用终止?的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 调用 API 时如何防止 UI 冻结

为啥我的 AsyncTask 会冻结我的 UI 线程?

后台api调用不冻结用户界面

UIActionSheet 中的 UIPickerView:UI 冻结

从 iCloud 获取图像将冻结 UI

WCF:尽管调用是异步的,但 DNS 查找会冻结 UI