我有一项服务,每2分钟拨打一次我的休息服务。在我的服务上,我有以下功能
getNotifications(token: string) {
const body = 'xxxxxxxxx=' + token;
return this.http.post('/rest/ssss/ddddddd/notificationcount', body, this.options)
.map((res) => res.json());
}
在我的组件上,我调用我的服务函数来调用API。
this.notificationService.getNotifications(this.token).subscribe((data) => {
console.log(data);
});
我想每2分钟拨打一次电话,最好的方法是什么?
答案 0 :(得分:27)
由于您已经在使用Observables
,只需充分利用它:Obersvable.interval()
是您的好朋友:
在您的组件中,执行以下操作:
Observable
.interval(2*60*1000)
.timeInterval()
.flatMap(() => this.notificationService.getNotifications(this.token))
.subscribe(data => {
console.log(data);
});
说明:
.interval()
创建一个每2个发出一个事件的observable
分钟。.timeInterval()
将发出项目的Observable转换为一个
它会发出两者之间经过的时间量的迹象
排放。.flatMap()
然后将每次服务电话打包,
将结果转换为可观察的并返回它。这确保了
您的服务呼叫在第0,第2,第4,第6 ......分钟被呼叫
同步。 (想想有很多.then()
),即第2分钟的服务只会在第0分钟的呼叫后被呼叫,第4分钟只会在第2分钟后被呼叫,依此类推。.subscribe()
最后您可以订阅数据如果您正在使用可管理运算符(rxjs5及更高版本),只需管道运算符而不是链接它们:
interval(2 * 60 * 1000)
.pipe(
flatMap(() => this.notificationService.getNotifications(this.token))
)
.subscribe(data => console.log(data))
答案 1 :(得分:2)
如果您使用的是rxJs 6+,则可以使用间隔方法来简化操作。像这样-
import { interval } from 'rxjs';
interval(3000).subscribe(x => /* do something */)
答案 2 :(得分:0)
如果您不想拨打http电话并且只想在2分钟后做某事,那么您可以执行以下操作。
Observable.interval(2*60*1000)
.subscribe(() => {
// do something.
// or callSomeMethod();
});
你还想做一件更重要的事情,一旦你离开你当前的页面,你就会破坏这个observable,因为你不希望在实际不需要的情况下在场景后面进行额外的计算。
有多个选项可以取消订阅此观察值。
您应该保存对observable的引用,并在onDestroy
方法中取消订阅。
this.observableRef = Observable.interval(60000)
.subscribe(() => {
// do something
});
// call this method in OnDestroy method of the page.
this.observableRef.unsubscribe();
Observable.interval(60000)
.takeUntil(this.destroyed$)
.subscribe(() => {
// do something
});
答案 3 :(得分:0)
我也有类似的需求。可以对某人有用,因此可以在这里写它。我的Angular版本是9.1.5。 我正在检查用户是否已登录,并每10分钟发送一次http请求,直到用户进入该组件。
const secondsCounter = interval(60000); //Refreshes every 10 minutes
secondsCounter
.pipe(
tap(console.log),
takeWhile(x => this.notificationService.isLoggedIn()),
flatMap(() => this.notificationService.getNotifications(this.token))
).subscribe()
答案 4 :(得分:0)
带有执行时间限制和按结果手动停止的小示例
this.insalesXlsSubject.pipe(
switchMap((job_id: string) => {
return interval(1000).pipe(
mergeMap((i) => {
return this.http.get(`${environment.backend}/${this.route.snapshot.params.insales_app_name}/api/make_insales_xls?job_id=${job_id}`)
}),
tap((y: any) => {
if (y.status == 'finished') {
this.insalesXlsStatusSubject.next()
}
}),
takeUntil(race([
this.insalesXlsStatusSubject,
timer(60 * 1000).pipe(
takeUntil(
this.insalesXlsStatusSubject
)
)
]))
)
})
).subscribe()
答案 5 :(得分:-1)
import {Observable} from 'rxjs/Rx';
Observable.interval(2 * 60 * 1000).subscribe(x => {
callyourmethod();
});
评论后更新
this.interval = setInterval(() => {
this.yourservicecallmethod();
}, 2 * 60 * 1000);