javascript - 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()
返回引用而不是新对象的预期行为吗?我是否在拦截器实现中犯了错误,如果没有,我该如何解决这个问题?
解决方案
推荐阅读
- python - 如何让 opencv-python 使用我编译的 openBLAS 库,而不是它附带的任何东西?(在树莓派 Linux 上)
- groovy - 版本比较并在 Groovy 中执行版本的顺序部署(Jenkins 文件)
- php - PHP计数变量和重定向
- amazon-web-services - AWS EC2 实例未加入 ECS 集群
- angular - Lazy loading in primeng table
- javascript - javascript将数组打印成段落
- excel - 在多个 Power Queries 中导入相同数据时,excel 是否会记住现有数据?
- apache - mod_rewrite:在第一次登录时将 # 字符更改为编码的 %23
- xslt - 多层次的慕尼黑分组
- javascript - 如何查看从按钮单击到 Chrome 开发工具中的请求调用的函数?