Quiero volver a intentar una cadena observable con un retraso (por ejemplo, 2 segundos).
Hay algunas preguntas similares respondidas con retryWhen . Pero retryWhen parece obsoleto y no quiero usarlo.
El siguiente código funciona, sin agregar el retraso, pero ¿cómo puedo agregar un retraso en esta cadena?
of('trigger') .pipe( switchMap(() => fetchData()), retry(5), catchError(() => of(returnThisIfRetriesAreFailed)) ) .subscribe(console.log); Intenté agregar delay(2000) , pero parece que no funciona.
No estoy seguro de lo que quieres decir con
El retraso y el reintento son aplicables solo si el primer intento falla
No pude encontrar ninguna condición en el código fuente que limitara la opción de delay para que sea aplicable solo al primer intento fallido.
Por lo tanto, debería poder pasar como un retraso ya sea un número fijo o un Observable. Por ejemplo:
of('trigger') .pipe( switchMap(() => fetchData()), retry({count: 5, delay: 2000}), catchError(() => of(returnThisIfRetriesAreFailed)) ) .subscribe(console.log);Si quería decir que solo desea retrasar el primer reintento, entonces podría intentar algo como esto:
of('trigger') .pipe( switchMap(() => fetchData()), retry({count: 5, delay: (_, retryCount) => retryCount === 1 ? timer(2000) : of({})}), catchError(() => of(returnThisIfRetriesAreFailed)) ) .subscribe(console.log);Usar:
of('trigger').pipe( switchMap(() => fetchData()), catchError((err, caught) => caught.pipe( repeat({ count: 1, delay: 2000 }), catchError(() => of(returnThisIfRetriesAreFailed)) )) ) .subscribe(console.log);