【发布时间】:2015-12-05 11:22:55
【问题描述】:
我通过服务公开了一个 HTTP GET 请求,并且有几个组件正在使用这些数据(用户的个人资料详细信息)。我希望第一个组件请求实际执行对服务器的 HTTP GET 请求并缓存结果,以便后续请求将使用缓存的数据,而不是再次调用服务器。
这是服务的一个示例,您如何建议使用 Angular2 和 typescript 实现此缓存层。
import {Inject, Injectable} from 'angular2/core';
import {Http, Headers} from "angular2/http";
import {JsonHeaders} from "./BaseHeaders";
import {ProfileDetails} from "../models/profileDetails";
@Injectable()
export class ProfileService{
myProfileDetails: ProfileDetails = null;
constructor(private http:Http) {
}
getUserProfile(userId:number) {
return this.http.get('/users/' + userId + '/profile/', {
headers: headers
})
.map(response => {
if(response.status==400) {
return "FAILURE";
} else if(response.status == 200) {
this.myProfileDetails = new ProfileDetails(response.json());
return this.myProfileDetails;
}
});
}
}
【问题讨论】:
-
我尝试了您的方法,但是当从两个不同的组件调用 getUserProfile(使用 .share())时,GET 请求仍会在服务器上执行两次。这是因为 ProfileService 是使用 @Inject(ProfileService) profileService 注入到调用组件的两个构造函数中的。我在这里错过了什么?
-
这取决于。如果您在每个组件中注入服务,您将获得两个不同的实例(通过注入我的意思是使用
providers/viewProviers)。如果是这种情况,您应该只将它注入您的顶级组件(在这两者之间)。如果不是这种情况,您应该尽可能添加更多代码和重现。 -
它们都使用相同的 ProfileService 实例(我通过放置一些私有 i 整数来验证这一点,每次调用方法时将其增加一个并将其打印到日志中,它会打印 0、1、2。 ..所以这意味着每次都使用相同的实例)。然而,由于某种原因,每次调用 getUserProfile 方法时,都会在服务器上再次执行 GET 请求。
-
你说得对,我刚刚尝试并遇到了同样的问题。我发现使用该方法返回一个
share(),它每次都会返回一个不同的共享(这是有道理的,一开始没看到)。但是,如果您重构它以在构造函数中发出请求并将其分配给变量,它将起作用。 TL;DR plnkr 与示例工作:plnkr.co/edit/kvha8GH0b9qkw98xLZO5?p=preview
标签: angular typescript