我想在角度6中实现以下目标:
while(true){
}
我尝试了TimerObservable,但由于请求是异步的,因此未能在请求完成后等待1秒。 目的是在请求花费很长时间时不调用api,而在请求花费较短时间完成时使最新响应迅速。
我的代码是:
TimerObservable.create(0, 1000)
.subscribe(() => {
this.api.getData().subscribe(
response => {
console.log(response);
}
);
});
答案 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