Как пропустить ошибку с задержкой в ​​RxJS с правильным выводом машинописи? - PullRequest
1 голос
/ 15 октября 2019

Я просто хочу зарегистрировать ошибку и пропустить этот шаг, но с задержкой и с истинным выводом машинописи.

const fetch = () =>
  Math.random() > 0.5
    ? Promise.resolve("Success")
    : Promise.reject("Some error");

const x = timer(0, 1000).pipe(
  mergeMap(() => fetch()),
  catchError((err, caught) => {
    console.log("Error: ", err);
    return caught; // After this a pipe starts again, but without delay, because a timer starts with 0 !!!
  }),
);

x.subscribe((data) => {
  console.log(data);
});

Мне нужно сделать задержку после обнаруженной ошибки.

1 Ответ

1 голос
/ 15 октября 2019

Вы ищете задержку только после обнаружения ошибки? В предоставленном вами коде может быть непреднамеренная ошибка, поскольку технически поток заканчивается после возникновения ошибки. Вы можете понять, что я имею в виду, изменив возвращаемое значение на правильную ошибку, например:

const x = timer(0, 1000).pipe(
    mergeMap(() => fetch()),
    catchError((err) => { // "caught" is not needed, it isn't really anything.
      console.log("Error: ", err);
      return of(err); // If you return the error properly, the stream will end on error as expected behavior.
    }),
);

Я подозреваю, что вы действительно хотите сделать это повторить попытку с таймером задержки, и вы можете сделать это, выполнивthis:

const x = timer(0, 1000).pipe(
    mergeMap(() => fetch()),
    retryWhen(errors =>
        errors.pipe(
            tap(errors => console.log('Error: ', errors)),
            delayWhen(() => timer(3000))
        )
    )
);

Это будет повторяться при возникновении ошибки через x секунд.

...