刷新服务中的数据
Refreshing data in service
API中的数据不断变化。 Angular 中刷新数据的最佳方式是什么? bitfinex.com API
我有一个服务和组件。在服务中我使用 'get'.
下载数据
服务:
getPrice(){
return this.http.get('xxx');
}
组件:
ngOnInit() {
this.getPrices();
setInterval(() => {
this.getPrices();
}, 5000);
}
getPrices(){
this.tick.getPrice().subscribe(prices => {
console.log(prices);
});
}
正如您在组件中看到的那样,我使用 'setInterval' 并每 5 秒刷新一次。
我尝试直接在服务中刷新数据
return interval(5000).pipe(
// ignore new term if same as previous term
distinctUntilChanged(),
// switch to new search observable each time the term changes
switchMap(() => this.http.get('xxx')),
);
但是5秒后才显示数据
我曾尝试在 this stackblitz 中重现您的问题,但我做不到。
你能试试这个并告诉我它有什么问题吗(除了服务器端的 CORS,你不能做任何事情)
您的问题可能与此有关:
根据他们的政策,您不能每 5 秒轮询一次 API(您正在对它们进行 DDOSing:P)。您每分钟可以执行约 10 个请求。
试试他们的 websocket api,它在数据发生变化时将数据流式传输给您,而无需从客户端进行轮询(服务器会在新数据可用时向您发送新数据,您只需要处理它)。
1) 如果您不在重定向/页面离开时销毁事件监听器,这将 运行 在后台运行。
我建议实现一个析构函数。
deregisterListeners() {
this.eventListeners.forEach(listener => {
listener();
});
_.remove(this.eventListeners); //this is lodash, it loops through all instances of w/e you're looping through
clearInterval(this.intervalFunc);
}
然后像这样在 ngOnInit 中添加事件监听器
this.eventListeners.push(this.$scope.$on("$destroy", this.deregisterListeners.bind(this)));
this.intervalFunc = setInterval(() => {
// your code / function that calls the data here
});
当您设置每 3 秒刷新一次时,它们会阻塞。 5秒最佳,测试:D
首先,我想在没有 websockets 的情况下学习,因此我的问题是如何做到最好。
return interval(5000).pipe(
// ignore new term if same as previous term
distinctUntilChanged(),
// switch to new search observable each time the term changes
switchMap(() => this.http.get('xxx')),
);
问题出在这段代码中。 interval(5000)
将在前 5 秒后每 5 秒仅发射一次。这是您观察到的行为。
您可以使用 timer(0,5000)
获取以 1 次发射开始然后每 5 秒重复一次的可观察对象。
此外,我不确定 distinctUntilChanged()
应该在这里做什么。 interval(5000)
将每 5 秒发出一个递增的数字,因此该值将始终是唯一的。
switchMap
后面似乎还有一个额外的逗号,您不需要。
API中的数据不断变化。 Angular 中刷新数据的最佳方式是什么? bitfinex.com API
我有一个服务和组件。在服务中我使用 'get'.
下载数据服务:
getPrice(){
return this.http.get('xxx');
}
组件:
ngOnInit() {
this.getPrices();
setInterval(() => {
this.getPrices();
}, 5000);
}
getPrices(){
this.tick.getPrice().subscribe(prices => {
console.log(prices);
});
}
正如您在组件中看到的那样,我使用 'setInterval' 并每 5 秒刷新一次。
我尝试直接在服务中刷新数据
return interval(5000).pipe(
// ignore new term if same as previous term
distinctUntilChanged(),
// switch to new search observable each time the term changes
switchMap(() => this.http.get('xxx')),
);
但是5秒后才显示数据
我曾尝试在 this stackblitz 中重现您的问题,但我做不到。
你能试试这个并告诉我它有什么问题吗(除了服务器端的 CORS,你不能做任何事情)
您的问题可能与此有关:
根据他们的政策,您不能每 5 秒轮询一次 API(您正在对它们进行 DDOSing:P)。您每分钟可以执行约 10 个请求。
试试他们的 websocket api,它在数据发生变化时将数据流式传输给您,而无需从客户端进行轮询(服务器会在新数据可用时向您发送新数据,您只需要处理它)。
1) 如果您不在重定向/页面离开时销毁事件监听器,这将 运行 在后台运行。
我建议实现一个析构函数。
deregisterListeners() {
this.eventListeners.forEach(listener => {
listener();
});
_.remove(this.eventListeners); //this is lodash, it loops through all instances of w/e you're looping through
clearInterval(this.intervalFunc);
}
然后像这样在 ngOnInit 中添加事件监听器
this.eventListeners.push(this.$scope.$on("$destroy", this.deregisterListeners.bind(this)));
this.intervalFunc = setInterval(() => {
// your code / function that calls the data here
});
当您设置每 3 秒刷新一次时,它们会阻塞。 5秒最佳,测试:D
首先,我想在没有 websockets 的情况下学习,因此我的问题是如何做到最好。
return interval(5000).pipe(
// ignore new term if same as previous term
distinctUntilChanged(),
// switch to new search observable each time the term changes
switchMap(() => this.http.get('xxx')),
);
问题出在这段代码中。 interval(5000)
将在前 5 秒后每 5 秒仅发射一次。这是您观察到的行为。
您可以使用 timer(0,5000)
获取以 1 次发射开始然后每 5 秒重复一次的可观察对象。
此外,我不确定 distinctUntilChanged()
应该在这里做什么。 interval(5000)
将每 5 秒发出一个递增的数字,因此该值将始终是唯一的。
switchMap
后面似乎还有一个额外的逗号,您不需要。