Angular 6无限循环并等待API响应

时间:2018-08-30 09:16:30

标签: angular rxjs

我想在角度6中实现以下目标:

while(true){

  • 调用API
  • 处理响应
  • 等待1秒

}

我尝试了TimerObservable,但由于请求是异步的,因此未能在请求完成后等待1秒。 目的是在请求花费很长时间时不调用api,而在请求花费较短时间完成时使最新响应迅速。

我的代码是:

TimerObservable.create(0, 1000)
  .subscribe(() => {
    this.api.getData().subscribe(
      response => {
        console.log(response);
      }
    );
  });

3 个答案:

答案 0 :(得分:1)

您总是可以为此使用递归。将调用放入函数中,成功后,等待1秒钟,然后再次调用该函数。

callApi() {
  this.api.getData().subscribe(
    response => {
      console.log(response);
      setTimeout(() => this.callApi(), 1000);
    }
  );
}

请记住,如果发生故障,此代码将停止,因此您可能还需要添加错误处理程序。例如,如果出现错误,您可能需要等待更长的时间

答案 1 :(得分:1)

您应该使用exhaustMap(see doc here)运算符将“间隔的”滴答声转换为api调用。 ExhaustMap将在启动新API之前等待API调用完成。

尝试一下(rxjs 6语法):

import { interval, of } from 'rxjs';
import { exhaustMap } from 'rxjs/operators';

interval(1000)
.pipe(
    exhaustMap(_ => this.api.getData())
)
.subscribe(response => console.log(response));

答案 2 :(得分:0)

这有点笨拙,但是如果您想始终先处理响应然后再等待,我不知道有什么更简单的方法。

Observable.timer(0, 1000)
  .concatMap(() => mockApiGetData()
    .concatMap(val => Observable.of(null)
      .delay(1000)
      .takeWhile(() => false)
      .startWith(val)
    )
  )
  .subscribe(val => console.log('process', val))

实时演示:https://stackblitz.com/edit/typescript-lemfdn?file=index.ts

另请参阅:Observable and how to control results pace