对于我的Angular应用程序,我必须从API获取数据。现在,我正在将数据加载到服务中,以便为组件提供数据。
export class DataService{
private dataSource = new Subject();
currentData = this.dataSource.asObservable();
constructor(private http: HttpClient) {
this.http.get('/api/v1/data').subscribe(data => {
this.updateData(data);
});
}
updateData(data) {
this.dataSource.next(data);
}
}
API数据每5分钟更改一次以显示最新数据。
我现在正在尝试检查端点上的数据是否已更改,以便触发新的GET
。
我的第一个想法是每5分钟制作一次GET
,但后来我意识到我将从网站加载开始。这使其无法与API同步。
我不确定WebSockets /服务器端事件是否可以正常工作,因为该API位于外部服务器上,除了读取它之外,其交互性受到限制。
那么,真的有其他方法吗?还是唯一的选择就是用请求对API进行垃圾邮件,看看它是否更改了?
编辑:也许可以使用带有最新更新时间戳的另一个端点。然后,前端可以检查其是否具有最新更新。
即使这并不能真正解决问题,也至少可以减少不必要的数据发送量。
答案 0 :(得分:1)
您可以使用可观察对象 Sourse
Observables Observables提供了在之间传递消息的支持 应用程序中的发布者和订阅者。可观察的报价 与其他用于事件处理的技术相比,具有明显的优势, 异步编程,并处理多个值。
可观察性是声明性的-也就是说,您为 发布值,但是直到消费者订阅才执行 对此。然后,订阅的消费者会收到通知,直到 功能完成,或者直到他们退订。
private subscribeLiveData(): void {
this.dataSubcribed = Observable.timer(5000)
.subscribe(() => this.refreshLiveData());
}
private refreshLiveData(): void {
this.postsSubscription = this._livedata.getTask().subscribe(
(data: YourModle[]) => {
this.yourmodaldata = data;
},
function (error) {
console.log(error);
},
function () {
console.log("done");
}
);
}
答案 1 :(得分:0)
当值自动更改时,U可以将您的方法放入组件中的DoCheck [Life Cycle Hook]组件中
答案 2 :(得分:0)
似乎轮询是最简单的选择。
现在,我将使用来自API的定时轮询,并通过全局时间进行同步。
getData() {
this.http.get("/assets/data.json").subscribe(data => {
this.updateData(data);
});
const timer = 5 * 60;
setTimeout(() => {
console.log(new Date());
this.getData();
}, timer * 1000);
}
也许我会尝试一下REST挂钩,但是稍后会发生。