Rxjs Wiederholen mit Delay-Funktion
Ich versuche, mit retry
mit delay
Funktion erwarte ich von der Funktion Anruf nach 1000ms Verzögerung, aber es doesnot, was kann der Fehler hier?
Blick auf die Ausgabe in der Konsole, es ist der gleiche time 16:22:48.
Erwarte ich 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;
},
() => {}
);
}
- und Konsolen-Ergebnis :
Du musst angemeldet sein, um einen Kommentar abzugeben.
delay()
wird verwendet, um die Einführung einer Verzögerung zwischen den Ereignissen ausgesendeten beobachten. Aber die beobachtbaren nie strahlt jede Veranstaltung. Es ist einfach, Fehler sofort.Was du suchst ist
retryWhen()
, die es erlaubt zu entscheiden, nach welchem Zeitraum zu wiederholen:RxJS 5:
RxJS 6:
Dadurch wird die gesamte beobachtbare nach 10 versuchen. Wenn Sie möchten, um Fehler der gesamten beobachtbaren nach 10 versuchen, die beobachtbaren zurück durch die retryWhen Rückruf werfen muss:
RxJS 5:
RxJS 6:
errors
istobservable<any>
und es nichtcomplete
MethodeProperty 'concat' does not exist on type 'Observable<any>'.
obwohl ich importiert haben, concat,import "rxjs/add/observable/concat";
!import "rxjs/add/operator/concat";
.pipe( retryWhen(error => error.pipe(delay(1000), take(3), concat(Observable.throw(error)))), catchError(myErrorHandler.bind(this)) )
Zu diesem add on @JB Nizet Antwort. Wenn Sie dieses schreiben in rxjs 5+ mit lettable Operatoren, Struktur als
retryWhen(errors => errors.pipe(delay(1000), take(5)))
.concat(Observable.throw()))
?....pipe(delay(1000), take(5), concat(Observable.throw()))
pipe(delay(1000), take(5), concat(Observable.throw('error message seems to be required')))
retryWhen(errors => concat(errors.pipe(delay(750), take(2)), throwError(errors))))
aber es wird nicht entfernen Sie den ursprünglichen Fehler.Dies kann helfen, Sie
Komme auf folgende Lösung, die mit
retryWhen
undObservable.Interval
, aber in dieser Lösungerror
Funktion abonnieren Sie ruft nie,Für ngrx5+ wir erstellen könnte-operator:
RxJS bietet retry-Betreiber, dass resubscribes die Beobachtbaren, für die angegebene Anzahl von zählen, wenn es ist ein Fehler. Bevor man Fehler Beobachtbar ist erneut abonnieren, für die angegebene Anzahl von Zählung durch wiederholen-Betreiber und, wenn immer noch es ist ein Fehler, dann Fehler geworfen wird. Wiederholung ist nützlich, um die Treffer der URL viele Male. Es ist möglich, dass aufgrund von Netzwerk-Bandbreite und die URL nicht wieder erfolgreich Daten in eine Zeit, und wenn es reties, kann es zurückgeben von Daten erfolgreich. Wenn nach retying es immer noch Fehler in Beobachtbaren dann catchError kann verwendet werden, um wieder Beobachtbare mit Benutzer-definierten Standard-Daten.
getBook(id: number): Observable {
wieder dieses.http.erhalten(dies.bookUrl + "/" + id).Rohr - (
wiederholen(3),
catchError(err => {
console.log(err);
Rückkehr(null);
})
);
}
Ich hatte kürzlich dieses problem, und fand, dass die akzeptierte Lösung verbessert werden könnte.
Was es im Grunde tut, ist zu wiederholen, wie erwähnt, aber das beendet sofort, ohne jegliche (falsche) Wert mit der 'ersten' - operator.
Wenn Sie nicht finden können, ein Wert innerhalb des timeout-Zeitraums, wird ein Fehler ausgelöst.