rxjs 5.5+ retryWhen не называет источник наблюдаемым? - PullRequest
0 голосов
/ 12 февраля 2019

Я чувствую, что здесь что-то очень простое.Я пытаюсь создать простую повторную попытку для выборки, но выполняется только код в retryWhen.Я использую React, поэтому у меня нет удобства this.http.get.Возможно, это проблема с from(/*promise*/)?Я пытался основать логику повтора на этой записи .

Это то, что я ожидал увидеть:

Getting data from fetch...
In the retryWhen
In the interval
/* repeat the previous 3 lines 3x times including the Fetch */
Giving up

Вместо этого я получаю:

Getting data from fetch...
In the retryWhen
In the interval...
In the interval...
In the interval...
In the interval...
Giving up

Таким образом, он просто повторяет код, который он повторяет при интервале, но не повторяет исходный вызов fetchData.Вероятно, я упускаю что-то фундаментальное из моих знаний RXJS.

Вот тестовый код:

const fetchData = new Promise((res, rej) => {
  console.log("Getting data from fetch...");
  rej(); // just fail immediately to test the retry
});

const source = from(fetchData)
  .pipe(
    retryWhen(_ => {
      console.log("In the retryWhen");
      return interval(1000).pipe(
        tap(_ => console.log("In the interval...")),
        flatMap(count => count == 3 ? throwError("Giving up") : of(count))
      )
    }));

source.subscribe(
  result => console.log(result),
  err => console.log(err)
);

1 Ответ

0 голосов
/ 12 февраля 2019

Измените код ниже, посмотрите, работает ли он.retryWhen передаст вам поток ошибок, который будет продолжать излучаться при возникновении ошибки.вы возвращаете timer, чтобы указать задержку между каждой попыткой внутри retryWhen.После задержки он повторит источник, наблюдаемый для вас

const fetchData = defer(() => new Promise((res, rej) => {
      console.log('in promise')
        rej("Failed to fetch data"); 
      // fail the first 2 times
    }) );

const source = fetchData.pipe(
  retryWhen(err => {
    let count = 0;
    console.log("In the retryWhen");
    return err.pipe(
      tap(_ => {
        count++;
        console.log("In the interval...");
      }),
      mergeMap(_ => (count == 2 ? throwError("Giving up") : timer(2000)))
    );
  })
);

source.subscribe(result => console.log(result), err => console.warn(err));

https://codepen.io/fancheung/pen/gqjawe

...