Angular 为什么大多数HttpClient API类都定义了不可变对象?

Angular 为什么大多数HttpClient API类都定义了不可变对象?,angular,immutability,angular-httpclient,Angular,Immutability,Angular Httpclient,以下是关于不变性的声明: 拦截器的存在是为了检查和变异传出的请求和 收到的答复。然而,我们可能会惊讶地发现 HttpRequest和HttpResponse类在很大程度上是不可变的 这是有原因的:因为应用程序可能会重试请求,所以 拦截器链可以多次处理单个请求。如果 请求是可变的,重试的请求将不同于 原始请求。不变性确保拦截器看到相同的内容 请求每次尝试 我觉得很难理解这个解释。有人能解释一下吗?不知道这个解释很难理解。这篇文章对此进行了深入的解释 当您调用http的任何方法(如get)时,Ang

以下是关于不变性的声明:

拦截器的存在是为了检查和变异传出的请求和 收到的答复。然而,我们可能会惊讶地发现 HttpRequest和HttpResponse类在很大程度上是不可变的

这是有原因的:因为应用程序可能会重试请求,所以 拦截器链可以多次处理单个请求。如果 请求是可变的,重试的请求将不同于 原始请求。不变性确保拦截器看到相同的内容 请求每次尝试


我觉得很难理解这个解释。有人能解释一下吗?

不知道这个解释很难理解。这篇文章对此进行了深入的解释

当您调用
http
的任何方法(如
get
)时,Angular会创建一个请求。然后,该请求用于启动一个可观察序列,当订阅时,该请求通过拦截器链传递。这是作为序列处理的一部分完成的(非常简化的代码):

函数get(){
let-req:HttpRequest=new-HttpRequest();
const events$=of(req).pipe(concatMap((req:HttpRequest)=>{
//通过拦截器链运行请求
this.handler.handle(req);
}));
返回$events;
}
以下是来自消息来源的评论:

从初始请求的Observable.of()开始,然后运行 处理程序(哪个 包括concatMap()中的所有拦截器)。这样,处理程序运行 在一个可观察链中,会导致拦截器在每个 订阅(这也会使重试重新运行处理程序,包括拦截器)


因此,
$events
流是从http请求方法返回的,可以重试。拦截器应始终以原始请求开始。如果请求是可变的,并且可以在拦截器的上一次运行期间修改,则无法满足此条件。因此,请求及其所有组成部分都应该是不变的。

我一直在等待有人将此资源添加到请求中,因为这个问题已经在这里和上个月的角度回购的问题跟踪程序中多次出现github@Jota.Toledo是的,这个问题也困扰了我一段时间。我现在正在完成一篇大文章,解释拦截器是如何在引擎盖下工作的,并且作为我调查的一部分解决了这个问题。
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;
}