你如何从 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>
我需要重试一系列 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>