如果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);
});
如何抛出属于集合中项目的错误?上面的代码似乎吞下了错误,而不是将它呈现给调用者来处理。
答案 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)
);