Angular 8:如何使用Observable的间隔立即发送http请求



我具有将请求从前端连续发送到后端的功能。所以我添加了下面给出的代码。

我想实现第一个请求应该立即发出,然后在两分钟后发出。

但根据间隔的定义,使用以下代码,它将在两分钟后发送第一个请求。

this.getData = Observable.interval(2 * 60 * 1000)
.pipe(flatMap(() => this.service.getData(b, b, b, b, b, b))).subscribe();

我不想重复代码,先添加一个请求,然后添加上面的代码,任何其他方式来完成它

解决此问题的最简单方法是使用timer运算符,而不是初始延迟为0秒的interval运算符。

this.getData = Observable.timer(0, 2 * 60 * 1000)
.pipe(flatMap(() => this.service.getData(b, b, b, b, b, b))).subscribe();

更新:使用repeatdelayWhen运算符

上述解决方案对于简单的用例非常有用。但是,如果需要动态控制每个请求之间的延迟并根据某些条件完成轮询,则可以使用repeatdelayWhentakeWhile运算符。

let condition = 0;
this.service.getData(b, b, b, b, b, b).pipe(
take(1),
delayWhen(_ => condition === 0 ? timer(0) : timer(2 * 60 * 1000)),   // set poll delay
repeat(),
takeWhile(_ => condition < 5),        // stop polling when `condition` is 5
switchMap(response => {
// do something and update the `condition`
condition++;
return of(response);
})
).subscribe(
res => console.log(res),
err => console.log(err),
() => console.log('complete')
);

当请求将被重复时,您也可以使用repeatWhen运算符对进行更精细的控制。