如何在Angular4中每隔15分钟触发一次调用API的方法

时间:2018-05-21 05:24:15

标签: angular

我正在使用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() });

任何人都可以指导我解决这个问题。

2 个答案:

答案 0 :(得分:1)

看到我对this的答案的评论。我认为这基本上是一回事(只有我的例子显示API每10秒钟而不是15分钟(15 * 60 * 1000 = 900000)。

需要考虑的一些事项:

很难从您的代码中了解所有内容,但通常情况下,您与API的交互将包含在Angular Service中,以封装您与该API的交互。 (您应该可以在上面的解决方案链接中看到相关示例。)我建议您创建一项新服务来替换END_USER_SESSIONINSERT_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'); }