当开发者在Dynatrace中查看这些请求时,他们将无法再看到超时后正在进行的API调用。该进程在后台呈现,但Dynatrace看到响应返回给客户端并停止记录,在这种情况下,如果它知道自己在做什么花了这么长时间,分析问题会更有帮助。我们可以引入一个AngularHTTP_INTERCEPTOR来超时等待已久的网络请求,从而确保缩短在服务器端启动的应用程序的生命周期。换句话说:因此SSR渲染不会因等待来自网络的缓慢API响应而挂起。但是,这可能需要在应用程序代码甚至SSR代码中添加额外的逻辑,以便在SSR响应中不会返回此类格式错误的渲染(基于不完整的数据)。在这种情况下,最好回退到不缓存标头的CSR应用程序,而不是允许将格式错误的渲染html作为响应发送(并且可能由CDN缓存)。一个例子。在app.module.ts里的代码:import{NgModule}from'@angular/core';import{BrowserModule}from'@angular/platform-b??rowser';import{HttpClientModule,HTTP_INTERCEPTORS}from'@angular/common/http';从'./interceptors'导入{RequestTimeoutHttpInterceptor,DEFAULT_TIMEOUT};从'./app.component'导入{AppComponent};@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}来自'@angular/core';从'@angular/common/http'导入{HttpInterceptor,HttpHandler,HttpRequest};从'rxjs'导入{empty,TimeoutError};从'rxjs/operators'导入{timeout,catchError};exportconstDEFAULT_TIMEOUT=newInjectionToken('defaultTimeout');@Injectable({providedIn:'root'})exportclassRequestTimeoutHttpInterceptorimplementsHttpInterceptor{constructor(@Inject(DEFAULT_TIMEOUT)protecteddefaultTimeout:number,){}intercept(req:HttpRequest,next:HttpHandler){constmodified=req.clone({setHeaders:{'X-Request-Timeout':`${this.defaultTimeout}`}});returnnext.handle(modified).pipe(timeout(this.defaultTimeout),catchError(err=>{if(errinstanceofTimeoutError)console.error('Timeouthasoccurred',req.url);returnempty();}));}}这里使用了rxjs的超时操作符如果在指定的时间间隔内没有发出值,则会抛出错误。请参见以下示例://RxJSv6+import{of}from'rxjs';import{concatMap,timeout,catchError,delay}from'rxjs/operators';//模拟请求函数makeRequest(timeToDelay){returnof('RequestComplete!').pipe(delay(timeToDelay));}of(4000,3000,2000).pipe(concatMap(duration=>makeRequest(duration).pipe(timeout(2500),catchError(error=>of(`Requesttimedoutafter:${duration}`)))))/**"请求超时时间:4000”*“请求超时时间:3000”*“请求完成!”*/.subscribe(val=>console.log(val));在这段代码中,我们首先使用delay操作符在makeRequest函数中指定一个时间间隔来模拟函数调用的Latency。然后给makeRequest返回的Observable加上一个timeout(2500)操作符,意思是在2.5秒内,如果Observable没有发出值,就会进入CatchError的处理逻辑。数据源有4000、3000、2000三个值,其中只有最后一个值小于2500,所以可以在超时间隔内完成函数调用。其他两个值都会导致超时,导致catchError的数据打印。