RxJS возвращает ошибку после повторной попытки, когда завершена - PullRequest
0 голосов
/ 03 октября 2019

Я хотел бы вернуть ошибку после завершения retryWhen. Вот пример кода:

const httpGet = (d, res) => {
  return rxjs.of(res).pipe(rxjs.operators.delay(d));
};

const repeat = () => {
  return httpGet(1000, false).pipe(
    rxjs.operators.tap(() => console.log("Response from repeat")),
    rxjs.operators.flatMap(res => {
      if (res === false) {
        // Throw error due to invalid response
        return rxjs.throwError("Invalid response inside repeat");
      }

      return rxjs.of(res);
    }),
    rxjs.operators.retryWhen(err => {
      // Retry same httpGet call due to invalid response
      return err.pipe(
        rxjs.operators.flatMap(e => {
          // Delay execution of next httpGet call
          return rxjs.timer(1000);
        }),
        // Retry httpGet call only 3 times
        rxjs.operators.take(3)
      );
    })
  );
};

const execute = () => {
  return httpGet(1000, false).pipe(
    rxjs.operators.tap(() => console.log("Response from execute")),
    rxjs.operators.switchMap(res => {
      // If res is false wait 1sec and execute repeat()
      if (res === false) {
        return rxjs.timer(1000).pipe(rxjs.operators.concatMapTo(repeat()));
      }

      return rxjs.of(res);
    })
  );
};

// Start executing
execute().subscribe(
  r => console.log("Response:", r),
  err => console.error("Error:", err),
  () => console.log("Completed")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.js"></script>

Это текущий вывод:

Response from execute
Response from repeat
Response from repeat
Response from repeat
Completed

И я хотел бы получить следующий вывод:

Response from execute
Response from repeat
Response from repeat
Response from repeat
Error: Some message

Поэтому мне нужно выдать ошибку в каком-то месте после завершения повторных вызовов без действительного ответа.

1 Ответ

0 голосов
/ 03 октября 2019

Вы можете бросить при последнем исполнении

   rxjs.operators.retryWhen(err => {
      let count=0;
      // Retry same httpGet call due to invalid response
      return err.pipe(
        rxjs.operators.flatMap(e => {
          ++count;
          console.log(count)
          // Delay execution of next httpGet call
          if(count===3) return rxjs.throwError(e);
          return rxjs.timer(1000);
        }),
        // Retry httpGet call only 3 times
        rxjs.operators.take(3)
      );
    })
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...