当某些异步任务永远挂起时,例如对后端API的http调用,AngularSSR渲染可能永远不会完成。在当前的SpartacusSSR实现中,已经采取了一些措施来改善渲染暂停时的监控体验:我们添加了配置SsrOptimizationOptions.maxRenderTime。maxRenderTime时间过后,我们登录控制台,可以看到渲染时间过长,可能会hang提示信息,但是也无能为力。理想情况下,我们应该尽量避免在渲染过程中挂起。首先,调查SSR中无休止的异步操作的最常见原因是什么,然后尝试阻止它们是个好主意。一个合理的猜测是,在大多数情况下,这是由于从不响应的HTTPAPI调用造成的。如果是这种情况,在SSR模式下,我们可以为所有API调用引入一个通用的http超时,因此它们最终将控制权返回给SSR服务器,这样SSR服务器就可以继续响应其他请求。AngularUniversal的一个限制是无法以编程方式中止挂起的渲染和释放分配的资源。作为一种解决方案,我们可以引入AngularHTTP_INTERCEPTOR,它可以使长时间挂起的网络请求超时,因此在服务器端启动的应用程序的生命周期较短。换句话说:所以SSR渲染不会“挂起”等待来自网络的缓慢API响应。但是,这可能需要在应用程序代码甚至SSR代码中添加额外的逻辑,以便在SSR响应中不会返回此类格式错误的呈现(基于不完整的数据)。在这种情况下,最好回退到具有无缓存标头的CSR应用程序,而不是允许将格式错误的呈现html作为响应发送(并且可能由CDN缓存)。下面是一个具体的例子:import{NgModule}from'@angular/core';import{BrowserModule}from'@angular/platform-b??rowser';import{HttpClientModule,HTTP_INTERCEPTORS}from'@angular/common/http';import{RequestTimeoutHttpInterceptor,DEFAULT_TIMEOUT}from'./interceptors';import{AppComponent}from'./app.component';@NgModule({imports:[BrowserModule,HttpClientModule,],declarations:[AppComponent,],providers:[{provide:HTTP_INTERCEPTORS,useClass:RequestTimeoutHttpInterceptor,multi:true},{provide:DEFAULT_TIMEOUT,useValue:5000},],bootstrap:[AppComponent]})exportclassAppModule{}import{Injectable,InjectionToken,Inject}from'@angular/core';从'@angular/common/http'导入{HttpInterceptor,HttpHandler,HttpRequest};从'rxjs'导入{empty,TimeoutError};从'rxjs/operators'导入{timeout,catchError};exportconstDEFAULT_TIMEOUT=newInjectionToken
