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.
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; }, () => {} ); }
and console result is :
delay()
is used to introduce a delay between events emitted by the observable. But the observable never emits any event. It just errors immediately.
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))) )
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))) )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With