我通过服务公开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;
}
});
}
}
Run Code Online (Sandbox Code Playgroud) 以下是我现在要将Observable转换为ReplaySubject的内容:
const subject = new Rx.ReplaySubject(1);
observable.subscribe(e => subject.next(e));
Run Code Online (Sandbox Code Playgroud)
这是进行转换的最佳方式,还是有更惯用的方式?
我创建了一个Angular服务,该服务基本上设置了带有一些用户信息的对象。当我更改用户时,该服务将发出可观察到的信息,并由同级组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到一个未定义的值。我已经读过有关使用publish()或share()将可观察对象转换为“热”对象的信息,但是我对RxJS还是很陌生,但我仍然不了解它在100%的情况下如何工作,所以我有点迷失了。
服务代码(相关部分):
getFwcUser() : Observable<FwcUser> {
return this.subjectFwcUser.asObservable();
}
setFwcUser(user : FwcUser) {
this.fwcUser = user;
this.subjectFwcUser.next(this.fwcUser);
}
Run Code Online (Sandbox Code Playgroud)
注意:FwcUser是带有某些用户字段的界面。我在按钮处理程序中运行setFwcUser以选择用户。
后期订阅者(组件代码):
ngOnInit() {
this.fwcUserService.getFwcUser()
.subscribe(
(user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; }
);
[......]
}
Run Code Online (Sandbox Code Playgroud)
始终打印:“已接收:未定义”。注意:该组件位于'* ngIf =“ fwcUser”'内部,因此当我从同级组件调用'setFwcUser'时正在加载该组件。
如何获得该组件以读取丢失的值?
另外,有人可以为初学者推荐一个很好的资源来学习RxJS吗?我正在阅读有关Angular4的几本书,但没有一本书能清楚地解释它。
谢谢!
如何从 Angular 8 中的 Observable 获取最后一个值?
let test = new BehaviorSubject<any>('');
test.next(this.AddressObservable);
let lastValue = test.subscribe(data=>console.log(data.value));
Run Code Online (Sandbox Code Playgroud)
由于某种原因它不起作用,检查调试器。
但是,这是在 html 中工作的, AddressObservable | async
尝试利用此链接,希望将值存储在变量中或显示在控制台日志中。任何更新的语法都会有所帮助。
笔记:
AddressObservable 是类型: Observable<AddressDto>