RxJS повторить попытку с функцией задержки

Я пытаюсь использовать retry С delay функция, я ожидаю, что функция вызовет после задержки 1000 мс, но это не так, что может быть ошибкой здесь? посмотреть на вывод консоли, это же время 16:22:48.

Я жду там 16:22:48, 16:22:59 ...

canCreate: boolean;
getSomeFunction(): Observable<boolean> {
        return new Observable<boolean>(
            observer => {
                const canCreate = null; // this is just null for now, will some value later
                if (canCreate == null) {
                    observer.error('error');
                } else {
                    observer.next(true);
                }
                observer.complete();
            }
        )
    }


this.getSomeFunction()
      .do((value) => {
        this.cCreate = value;
      }, (error) => {
         console.log(error + new Date().toTimeString());
      })
      .delay(1000)
      .retry(10)
      .subscribe(
        value => this.cCreate = value,
        error => {
          this.cCreate = false;
        },
        () => {}
      );
  }

и результат консоли:

enter image description here

4 ответов


delay() используется для введения задержки между событиями, излучаемого наблюдаемым. Но наблюдаемое никогда не испускает никакого события. Это просто ошибки сразу.

то, что вы ищете-это retryWhen(), что позволяет решить, когда повторить попытку:

  .retryWhen(errors => errors.delay(1000).take(10))

Это завершит все наблюдаемое после 10 попыток. Если вы хотите ошибиться во всем наблюдаемом после 10 попыток, наблюдаемый, возвращаемый обратным вызовом retryWhen, должен бросить:

  .retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw()))

добавить к ответу @ JB Nizet. Если вы пишете это в rxjs 5+ с операторами lettable, структурируйте его как

retryWhen(errors => errors.pipe(delay(1000), take(5)))


Это может помочь вам

let values$ = Rx.Observable.interval(1000).take(5);
let errorFixed = false;

values$
.map((val) => {
   if(errorFixed) { return val; }
   else if( val > 0 && val % 2 === 0) {
      errorFixed = true;
      throw { error : 'error' };

   } else {
      return val;
   }
})
.retryWhen((err) => {
    console.log('retrying again');
    return err.delay(1000).take(3); // 3 times
})
.subscribe((val) => { console.log('value',val) });

Я придумал следующее решение, используя retryWhen и Observable.Interval, но в это решение, error функция подписаться никогда не звонит,

this.branchService.getCanCreate()
  .do((value) => {
    this.cCreate = value;
  }, (error) => {
    console.log('do', error + new Date().toTimeString());
  })
  .retryWhen(errors => {
    return Observable.interval(1000).take(3).concat(Observable.throw('error')));
  })
  .subscribe(
    value => {
      this.cCreate = !!value
      console.log('success', new Date().toTimeString());
    },
    error => {
      console.log('subscribe', error + new Date().toTimeString());
      this.cCreate = false;
    },
    () => {
      console.log('finally', new Date().toTimeString());
    }
  );