你如何从 RXJS Observable retryWhen 抛出错误

how do you throw an error from RXJS Observable retryWhen

我需要重试一系列 RxJS 可观察对象,如果在 3 次尝试后收集不成功,则抛出序列中项目的错误对象。我找到了这个例子(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);
});

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

在您的信息流中,您基本上只是去除了错误,并通过在 zip 中使用此选择器函数仅考虑了 count(_, i) => i -其中 _ 将是错误。

我已经调整了你的流并删除了选择器功能,这在这里并不是真正需要的 - 现在它将重试 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)
);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>