带有延迟功能的Rxjs重试 [英] Rxjs Retry with Delay function

查看:461
本文介绍了带有延迟功能的Rxjs重试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将retrydelay函数一起使用,我希望函数会在1000ms延迟后调用,但事实并非如此,这可能是什么错误? 看控制台的输出,是16:22:48.

I am trying to use retry with delay function, I expect function will call after 1000ms delay, but it doesnot, what can be error here? look at console output, it is same time 16:22:48.

我希望在那里16:22:48、16:22:59 ...

I expect there 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;
        },
        () => {}
      );
  }

,控制台结果为:

推荐答案

delay() 用于在可观察者发出的事件之间引入延迟.但是可观察对象永远不会发出任何事件.只是立即出错.

delay() is used to introduce a delay between events emitted by the observable. But the observable never emits any event. It just errors immediately.

您要查找的是 retryWhen() ,它可以决定重试多长时间后:

What you're looking for is retryWhen(), which allows deciding after how long to retry:

RxJS 5:

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

RxJS 6:

import { retryWhen, delay, take } from 'rxjs/operators'
someFunction().pipe(
  // ...
  retryWhen(errors => errors.pipe(delay(1000), take(10)))
)

这将在10次尝试后完成整个可观察的过程.如果您想在10次尝试后对整个可观察的对象进行错误处理,则retryWhen回调返回的可观察对象必须抛出:

This will complete the whole observable after 10 attempts. If you want to error the whole observable after 10 attempts, the observable returned by the retryWhen callback must throw:

RxJS 5:

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

RxJS 6:

import { retryWhen, delay, take, concatMap, throwError } from 'rxjs/operators'
someFunction().pipe(
  // ...
  retryWhen(errors => errors.pipe(delay(1000), take(10), concatMap(throwError)))
)

这篇关于带有延迟功能的Rxjs重试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆