Saltar al contenido

Cómo crear un RXjs RetryWhen con retraso y límite de intentos

Solución:

Debe aplicar el límite a la señal de reintento, por ejemplo, si solo desea 10 reintentos:

loadSomething(): Observable<SomeInterface> {
  return this.http.get(this.someEndpoint, commonHttpHeaders())
    .retryWhen(errors => 
      // Time shift the retry
      errors.delay(500)
            // Only take 10 items
            .take(10)
            // Throw an exception to signal that the error needs to be propagated
            .concat(Rx.Observable.throw(new Error('Retry limit exceeded!'))
    );

EDITAR

Algunos de los comentaristas preguntaron cómo asegurarse de que el último error sea el que se arroje. La respuesta es un poco menos limpia pero no menos poderosa, solo use uno de los operadores de mapas de acoplamiento (concatMap, mergeMap, switchMap) para verificar en qué índice se encuentra.

Nota: Usando el nuevo RxJS 6 pipe sintaxis para pruebas futuras (esto también está disponible en versiones posteriores de RxJS 5).

loadSomething(): Observable<SomeInterface> {
  const retryPipeline = 
    // Still using retryWhen to handle errors
    retryWhen(errors => errors.pipe(
      // Use concat map to keep the errors in order and make sure they
      // aren't executed in parallel
      concatMap((e, i) => 
        // Executes a conditional Observable depending on the result
        // of the first argument
        iif(
          () => i > 10,
          // If the condition is true we throw the error (the last error)
          throwError(e),
          // Otherwise we pipe this back into our stream and delay the retry
          of(e).pipe(delay(500)) 
        )
      ) 
  ));

  return this.http.get(this.someEndpoint, commonHttpHeaders())
    // With the new syntax you can now share this pipeline between uses
    .pipe(retryPipeline)
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *