如何使用rxjs

时间:2019-05-21 10:28:09

标签: node.js rxjs rxjs6

我想重试http请求,直到某些数据存在多达10次为止,每次重试之间有2秒的延迟。

const $metrics = from(axios(this.getMetrics(session._id, sessionRequest._id, side)));

const res = $metrics.pipe(
  map((val: any) => {
    console.log("VALUE:", val.data.metrics.length);
    if (val.data.metrics.length === 0) {
      throw val;
    }
    return val;
  }),
  retryWhen((errors) => errors.pipe(delay(2000), take(10))),
).subscribe();

我正在尝试遵循文档中的示例。 https://www.learnrxjs.io/operators/error_handling/retry.html

  1. 我创建了可从axios http承诺中观察到的$metrics
  2. 我使用map运算符检查http请求的响应是否符合我的条件,然后重试。 val.data.metrics.length === 0。如果这样做,则会引发错误。
  3. 我最多重试http请求10次,延迟10秒。

我希望在经过3-4次重试后,此指标数组才能有数据,但是在控制台中,当我记录响应时,会得到以下信息。

VALUE: 0

我不确定这是否发出多个http请求,因为控制台日志仅返回一个输出而不是10。

更新

我已经更新了代码以使用retryWhen而不是retry,它会延迟2秒,并且在停止之前只会出现10个错误。

现在,我相信问题在于它仅发出1个http请求,因为控制台日志仅返回单个输出。

1 个答案:

答案 0 :(得分:0)

尝试使用defer()

const $metrics = defer(()=>from(axios(this.getMetrics(session._id, sessionRequest._id, side))))

需要指出的一点是,您应该检查“网络”标签,然后查看请求是否重试。您的console.log在map()运算符中,抛出错误时将被跳过,这可能就是为什么您在此处看不到console.log的原因。您可以尝试下面的示例。

import { timer, interval,from } from 'rxjs';
import { map, tap, retryWhen, delayWhen,delay,take } from 'rxjs/operators';

//emit value every 1s
const source = from(fetch('http://kaksfk')).pipe(
tap(val => console.log(`fetcching you won't see`)),)
const example = source.pipe(
  retryWhen(errors =>
    errors.pipe(
      //log error message
      tap(val => console.log(`retrying`)),
      //restart in 5 seconds
      delay(2000),
      take(5)
    )
  )
);