在重试之前获取错误运算符

时间:2017-10-24 17:36:10

标签: angular rxjs

我正在学习使用retryWhen运算符,但我遇到了在retryWhen运算符执行时或之前收到错误的问题。这是我的第一个代码:

ngOnInit() {
  this.subs1 = this.rateService.getClpBtc()
    .subscribe(prices => {
      this.clpbtc = prices.ticker.min_ask[0];
    }, errors => {
      if (errors) {
        this.surbtcErrors = errors;
        console.log(`The name is: ${errors}`);
      }
      else {
        this.surbtcErrors = null;
      }
    });
}

这工作正常,我可以在名为surbtcErrors的属性中获取错误。但后来我在.retryWhen(errors => errors.delay(5000))运算符之前添加了subscribe,我意识到即使出现错误,我的属性也是空的,因为我认为订阅运算符没有执行(我不确定,我正在学习。

所以,经过一些研究我尝试了这个:

ngOnInit() {
  this.subs1 = this.rateService.getClpBtc().retryWhen(function(errors) {
    if (errors) {
      console.log(`Error: ${errors}`);
      errors.delay(5000);
      return this.surbtcErrors = errors;
    } else {
      console.log("SIN ERROR")
      return this.surbtcErrors = null;
    }
  })
  .subscribe(prices => {
    this.clpbtc = prices.ticker.min_ask[0];
  }, errors => {
    if (errors) {
      this.surbtcErrors = errors;
      console.log(`The name is: ${errors}`);
    } else {
      this.surbtcErrors = null;
    }
  });
}

使用此代码我得到Error: [Object object]。所以,我的问题是如何才能得到错误,以便我可以在surbtcErrors属性中使用它?

1 个答案:

答案 0 :(得分:2)

传递给errors函数的retryWhen参数是一个可观察到的错误流。此函数应返回一个可观察的流,指示何时重试。示例errors => errors.delay(500)基本上表示只是在发生任何错误后重试500毫秒。

错误到达时,您可以使用https://www.rabbitmq.com/ha.html运行副作用。在您的情况下,副作用是将错误存储为组件的变量。

为此,我们只需在.do(...)之前插入.delay子句。像这样:

this.rateService.getClpBtc()
  .retryWhen(errors => errors
               .do(error => this.subtcErrors = error)
               .delay(500));