首页 > 解决方案 > Angular HttpResponse.clone() 不会创建新对象

问题描述

我根据这篇文章创建了一个小型缓存拦截器,我发现它HttpResponse.clone()返回相同的引用,而不是创建一个新对象。我非常希望它能够像复制构造函数一样工作,或者创建我的响应对象的深层副本。Angular 文档对预期行为没有说明太多: https ://angular.io/api/common/http/HttpResponse

我创建了一个小例子: https ://stackblitz.com/edit/angular-interceptors-rtrycu?file=app%2Finterceptors.ts

正如您在控制台中看到的,第一个缓存的响应是正确的,但是如果我在接收到的 Http 响应中更改某些内容,我将更改原始对象,就像clone()返回的标准 JS 对象引用一样。

// Interceptor
cache: Map<string, HttpResponse<any>> = new Map();

intercept(
// ...
  if (cachedResponse) {
    return of(cachedResponse.clone());
  else {
    return next.handle(req);
  }
)

// Subscription in the component
this.http.get<any>(url).subscribe(res => {
  res.title = "Invalid title!"; // cached data in interceptor is modified!

我想到的工作解决方案是手动进行深层复制,fe:

return of(JSON.parse(JSON.stringify(cachedResponse.clone()))); <--this works

这是HttpResponse.clone()返回引用而不是新对象的预期行为吗?我是否在拦截器实现中犯了错误,如果没有,我该如何解决这个问题?

编辑:https ://github.com/angular/angular/issues/41454

标签: javascriptangular

解决方案


推荐阅读