RxJS повторить попытку с функцией задержки
Я пытаюсь использовать retry
С delay
функция, я ожидаю, что функция вызовет после задержки 1000 мс, но это не так, что может быть ошибкой здесь?
посмотреть на вывод консоли, это же время 16:22:48.
Я жду там 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;
},
() => {}
);
}
и результат консоли:
4 ответов
delay()
используется для введения задержки между событиями, излучаемого наблюдаемым. Но наблюдаемое никогда не испускает никакого события. Это просто ошибки сразу.
то, что вы ищете-это retryWhen()
, что позволяет решить, когда повторить попытку:
.retryWhen(errors => errors.delay(1000).take(10))
Это завершит все наблюдаемое после 10 попыток. Если вы хотите ошибиться во всем наблюдаемом после 10 попыток, наблюдаемый, возвращаемый обратным вызовом retryWhen, должен бросить:
.retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw()))
добавить к ответу @ JB Nizet. Если вы пишете это в rxjs 5+ с операторами lettable, структурируйте его как
retryWhen(errors => errors.pipe(delay(1000), take(5)))
Это может помочь вам
let values$ = Rx.Observable.interval(1000).take(5);
let errorFixed = false;
values$
.map((val) => {
if(errorFixed) { return val; }
else if( val > 0 && val % 2 === 0) {
errorFixed = true;
throw { error : 'error' };
} else {
return val;
}
})
.retryWhen((err) => {
console.log('retrying again');
return err.delay(1000).take(3); // 3 times
})
.subscribe((val) => { console.log('value',val) });
Я придумал следующее решение, используя retryWhen
и Observable.Interval
, но в это решение, error
функция подписаться никогда не звонит,
this.branchService.getCanCreate()
.do((value) => {
this.cCreate = value;
}, (error) => {
console.log('do', error + new Date().toTimeString());
})
.retryWhen(errors => {
return Observable.interval(1000).take(3).concat(Observable.throw('error')));
})
.subscribe(
value => {
this.cCreate = !!value
console.log('success', new Date().toTimeString());
},
error => {
console.log('subscribe', error + new Date().toTimeString());
this.cCreate = false;
},
() => {
console.log('finally', new Date().toTimeString());
}
);