如何使用 RXJS 每 2 分钟进行一次 http 调用?
How to make an http call every 2 minutes with RXJS?
我有一项服务会每 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 分钟打一次这个电话,最好的方法是什么?
import {Observable} from 'rxjs/Rx';
Observable.interval(2 * 60 * 1000).subscribe(x => {
callyourmethod();
});
评论后更新
this.interval = setInterval(() => {
this.yourservicecallmethod();
}, 2 * 60 * 1000);
既然你已经在使用Observables
,那就好好利用吧:)Obersvable.interval()
是你的好朋友:
在您的组件中,执行此操作:
Observable
.interval(2*60*1000)
.timeInterval()
.mergeMap(() => this.notificationService.getNotifications(this.token))
.subscribe(data => {
console.log(data);
});
解释:
.interval()
创建一个每 2 次发出一个事件的 Observable
分钟。
.timeInterval()
将发射物品的 Observable 转换为一个
发出这些之间经过的时间量的指示
排放量。
.mergeMap()
然后包装您的 每次 服务调用,
将结果转换为可观察对象并 return 它。这确保
您在第 0、2、4、6 分钟的服务电话被称为
同步地。 (想想有很多.then()
),即第0分钟调用后才会调用第2分钟的服务,第2分钟后才会调用第4分钟,依此类推。
.subscribe()
终于可以订阅数据了
更新:
如果您使用可管道运算符(rxjs5 及更高版本),只需将运算符通过管道传输而不是将它们链接起来:
interval(2 * 60 * 1000)
.pipe(
mergeMap(() => this.notificationService.getNotifications(this.token))
)
.subscribe(data => console.log(data))
如果您不想进行 http 调用,只想在 2 分钟后执行某些操作,那么您可以执行如下操作。
Observable.interval(2*60*1000)
.subscribe(() => {
// do something.
// or callSomeMethod();
});
如果您使用的是 rxjs 6+,那么您可以这样做:
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
});
如果你使用的是rxJs 6+,你可以简单的使用interval方法来做。像这样 -
import { interval } from 'rxjs';
interval(3000).subscribe(x => /* do something */)
我有一个类似的 need.can 对某人有用,因此写它 here.My 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()
我的小例子,有执行时间限制和手动停止结果
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()
我有一项服务会每 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 分钟打一次这个电话,最好的方法是什么?
import {Observable} from 'rxjs/Rx';
Observable.interval(2 * 60 * 1000).subscribe(x => {
callyourmethod();
});
评论后更新
this.interval = setInterval(() => {
this.yourservicecallmethod();
}, 2 * 60 * 1000);
既然你已经在使用Observables
,那就好好利用吧:)Obersvable.interval()
是你的好朋友:
在您的组件中,执行此操作:
Observable
.interval(2*60*1000)
.timeInterval()
.mergeMap(() => this.notificationService.getNotifications(this.token))
.subscribe(data => {
console.log(data);
});
解释:
.interval()
创建一个每 2 次发出一个事件的 Observable 分钟。.timeInterval()
将发射物品的 Observable 转换为一个 发出这些之间经过的时间量的指示 排放量。.mergeMap()
然后包装您的 每次 服务调用, 将结果转换为可观察对象并 return 它。这确保 您在第 0、2、4、6 分钟的服务电话被称为 同步地。 (想想有很多.then()
),即第0分钟调用后才会调用第2分钟的服务,第2分钟后才会调用第4分钟,依此类推。.subscribe()
终于可以订阅数据了
更新:
如果您使用可管道运算符(rxjs5 及更高版本),只需将运算符通过管道传输而不是将它们链接起来:
interval(2 * 60 * 1000)
.pipe(
mergeMap(() => this.notificationService.getNotifications(this.token))
)
.subscribe(data => console.log(data))
如果您不想进行 http 调用,只想在 2 分钟后执行某些操作,那么您可以执行如下操作。
Observable.interval(2*60*1000)
.subscribe(() => {
// do something.
// or callSomeMethod();
});
如果您使用的是 rxjs 6+,那么您可以这样做:
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 });
如果你使用的是rxJs 6+,你可以简单的使用interval方法来做。像这样 -
import { interval } from 'rxjs';
interval(3000).subscribe(x => /* do something */)
我有一个类似的 need.can 对某人有用,因此写它 here.My 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()
我的小例子,有执行时间限制和手动停止结果
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()