你怎么从RXJS Observable retryWhen

时间:2017-02-28 23:11:24

标签: rxjs rxjs5

如果3次尝试后集合不成功,我需要重试一系列RxJS observable并在序列中抛出项目的错误对象。我找到了这个例子(An incremental back-off strategy for handling errors):

var source = get('url').retryWhen(
attempts =>
attempts
  .zip(Observable.range(1, 3), (_, i) => i)
  .flatMap(i => {
    console.log('delay retry by ' + i + ' second(s)');
    return Rx.Observable.timer(i * 1000);
  });
);

var subscription = source.subscribe(
data => {
// Displays the data from the URL or cached data
console.log(data);
});

如何抛出属于集合中项目的错误?上面的代码似乎吞下了错误,而不是将它呈现给调用者来处理。

1 个答案:

答案 0 :(得分:4)

在您的信息流中,您基本上只是在您的zip (_, i) => i中使用此选择器功能,删除了错误并仅考虑了计数 - 其中{{1}将是错误。

我已经调整了您的流并删除了选择器功能,这在这里并不是真的需要 - 现在它将重试3次然后再次失败时抛出错误。



_

const source = Rx.Observable.create(o => {
    o.error(new Error("always fails"));
  })
  .retryWhen(attempts => attempts
    .zip(Rx.Observable.range(1, 4))
    .flatMap(([error, i]) => {
      if (i > 3) {
        return Rx.Observable.throw(error);
      }
      console.log('delay retry by ' + i + ' second(s)');
      return Rx.Observable.timer(i * 100);
    })
  );

source.subscribe(
  data => console.log(data),
  error => console.error(error)
);