Max*_*kyi 3 immutability angular angular-httpclient
HttpClient的文档说明了关于不变性的以下内容:
存在拦截器来检查和改变传出请求和传入响应.但是,了解HttpRequest和HttpResponse类在很大程度上是不可变的可能会令人惊讶.
这是有原因的:因为app可能会重试请求,拦截器链可能会多次处理单个请求.如果请求是可变的,则重试的请求将与原始请求不同.不可变性确保拦截器在每次尝试时都看到相同的请求.
我发现很难理解这个解释.有人可以提供解释吗?
在不知道源代码的情况下,这种解释很难理解.这篇文章深入探讨了Insider的拦截器指南和Angular中的HttpClient机制.
当您调用任何方法时http,例如get,Angular会创建一个请求.然后,此请求用于启动可观察序列,并且在订阅时,此请求通过拦截器链传递.这是作为序列处理的一部分完成的(非常简化的代码):
function get() {
let req: HttpRequest<any> = new HttpRequest<any>();
const events$ = of(req).pipe(concatMap((req: HttpRequest<any>) => {
// running request through interceptors chain
this.handler.handle(req);
}));
return $events;
}
Run Code Online (Sandbox Code Playgroud)
以下是来源的评论:
从Observable.of()初始请求开始,并在concatMap()内运行处理程序(包括所有拦截器).这样,处理程序在一个Observable链中运行,这会导致在每个订阅上重新运行拦截器(这也会使重试重新运行处理程序,包括拦截器).
因此,$events流是从http请求方法返回的,可以重试.拦截器应始终以原始请求开头.如果请求是可变的并且可以在上一次拦截器运行期间进行修改,则无法满足此条件.因此,请求及其所有组成部分应该是不可变的.
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |