带有延迟功能的Rxjs重试 [英] Rxjs Retry with Delay function
问题描述
我正在尝试将retry
与delay
函数一起使用,我希望函数会在1000ms延迟后调用,但事实并非如此,这可能是什么错误?
看控制台的输出,是16:22:48.
I am trying to use retry
with delay
function, I expect function will call after 1000ms delay, but it doesnot, what can be error here?
look at console output, it is same time 16:22:48.
我希望在那里16:22:48、16:22:59 ...
I expect there 16:22:48, 16:22:59 ...
canCreate: boolean;
getSomeFunction(): Observable<boolean> {
return new Observable<boolean>(
observer => {
const canCreate = null; // this is just null for now, will some value later
if (canCreate == null) {
observer.error('error');
} else {
observer.next(true);
}
observer.complete();
}
)
}
this.getSomeFunction()
.do((value) => {
this.cCreate = value;
}, (error) => {
console.log(error + new Date().toTimeString());
})
.delay(1000)
.retry(10)
.subscribe(
value => this.cCreate = value,
error => {
this.cCreate = false;
},
() => {}
);
}
,控制台结果为:
推荐答案
delay()
用于在可观察者发出的事件之间引入延迟.但是可观察对象永远不会发出任何事件.只是立即出错.
delay()
is used to introduce a delay between events emitted by the observable. But the observable never emits any event. It just errors immediately.
您要查找的是 retryWhen()
,它可以决定重试多长时间后:
What you're looking for is retryWhen()
, which allows deciding after how long to retry:
RxJS 5:
.retryWhen(errors => errors.delay(1000).take(10))
RxJS 6:
import { retryWhen, delay, take } from 'rxjs/operators'
someFunction().pipe(
// ...
retryWhen(errors => errors.pipe(delay(1000), take(10)))
)
这将在10次尝试后完成整个可观察的过程.如果您想在10次尝试后对整个可观察的对象进行错误处理,则retryWhen回调返回的可观察对象必须抛出:
This will complete the whole observable after 10 attempts. If you want to error the whole observable after 10 attempts, the observable returned by the retryWhen callback must throw:
RxJS 5:
.retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw()))
RxJS 6:
import { retryWhen, delay, take, concatMap, throwError } from 'rxjs/operators'
someFunction().pipe(
// ...
retryWhen(errors => errors.pipe(delay(1000), take(10), concatMap(throwError)))
)
这篇关于带有延迟功能的Rxjs重试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!