我正在使用Angular 4应用程序,在此我需要每隔15分钟调用一次API。我读了一些stackoverflow帖子,但我无法得到我正在寻找的内容。
这是我到目前为止所尝试过的。
UPDATE_USER_SESSION() {
this.publicIp.v4().then(ip => {
this.END_USER_SESSION(ip)
})
this.publicIp.v4().then(ip => {
this.INSERT_USER_SESSION(ip)
})
}
我在ngOnInit旁边有这个方法。我希望每隔15分钟调用一次这个方法。
在ngOnInit里面我有以下
import 'rxjs/add/observable/interval';
this.call = Observable.interval(10000)
.subscribe((val) => { this.UPDATE_USER_SESSION() });
任何人都可以指导我解决这个问题。
答案 0 :(得分:1)
看到我对this的答案的评论。我认为这基本上是一回事(只有我的例子显示API每10秒钟而不是15分钟(15 * 60 * 1000 = 900000)。
需要考虑的一些事项:
很难从您的代码中了解所有内容,但通常情况下,您与API的交互将包含在Angular Service中,以封装您与该API的交互。 (您应该可以在上面的解决方案链接中看到相关示例。)我建议您创建一项新服务来替换END_USER_SESSION
和INSERT_USER_SESSION
函数。
Angular服务应该看起来像:
@Injectable()
export UserSessionService {
constructor(private http: HttpClient) {}
public endUserSession(ip: string): Observable<void> {
// use the HttpClient to hit the API with the given IP
}
public insertUserSession(ip: string): Observable<void> {
// use the HttpClient to hit the API with the given IP
}
}
然后你的组件代码应该是这样的:
@Component({
//...
})
export class YourComponent implements OnInit, OnDestroy {
private alive: boolean;
private publicIp = require('public-ip');
constructor(private userSessionService: UserSessionService){}
ngOnInit(){
this.alive = true;
TimerObservable.create(0, 900000)
.pipe(
takeWhile(() => this.alive)
)
.subscribe(() => {
this.publicIp.v4().then(ip => {
this.userSessionService.endUserSession(ip).subscribe(() => {
this.userSessionService.insertUserSession(ip).subscribe(() => {
// do nothing
});
});
});
});
}
ngOnDestroy(){
this.alive = false;
}
}
请注意insertUserSession
内部subscribe()
来电的嵌套
endUserSession
。这将使您insertUserSession
来电之后发出endUserSession
来电(在上面的代码中,两者中的哪一个会先出现竞争条件)。
答案 1 :(得分:0)
我认为您可以将Observable用于此
需要导入import 'rxjs/add/observable/interval';
并使用
this.obs = Observable.interval(10000)
.subscribe((val) => { console.log('called'); }