我有一系列可观察的东西,需要按顺序触发。一旦发生错误,我需要抓住错误,记录下来,然后继续观察。
此刻,一旦发生错误,观察者将停止。观察者必须继续并且不要在错误时重新启动或完成,这一点很重要。
import * as Rx from "rxjs";
const source = [
Rx.Observable.from("1").delay(200),
Rx.Observable.from("2").delay(150),
Rx.Observable.throw("error"),
Rx.Observable.from("3").delay(124),
Rx.Observable.from("4").delay(201),
];
let sSource = Rx.Observable.concat(...source);
sSource.subscribe((v) => {console.log(v)}, (e) => {console.log(e)});
当前输出:
1
2
error
预期输出:
1
2
error
3
4
我们能想到的唯一解决方案是预循环source
可观察对象,并分别向它们添加捕获处理程序,然后一旦发生错误,将对其进行正确处理,并且观察者可以继续执行而无需完成整个串联可观察的。
我们觉得应该对此有一个更优雅的解决方案。如果需要,我将发布当前解决方案。
答案 0 :(得分:3)
您可以将catch
运算符应用于每个源可观察对象,并可以在其中执行错误记录。像这样:
const sources = [
Rx.Observable.from("1").delay(200),
Rx.Observable.from("2").delay(150),
Rx.Observable.throw("error"),
Rx.Observable.from("3").delay(124),
Rx.Observable.from("4").delay(201),
];
const sourcesWithCatch = sources.map(s => s.catch(e => {
console.log(e);
return Rx.Observable.empty();
}));
const concatted = Rx.Observable.concat(...sourcesWithCatch);
concatted.subscribe(v => console.log(v));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
答案 1 :(得分:0)
为了将来参考,Rxjs 5具有onErrorResumeNext
函数,其功能类似于Visual Basic On Error Resume Next
语句。
var source = Rx.Observable.onErrorResumeNext(
Rx.Observable.just(42),
Rx.Observable.throw(new Error()),
Rx.Observable.just(56),
Rx.Observable.throw(new Error()),
Rx.Observable.just(78)
);
var subscription = source.subscribe(
data => console.log(data)
);
// => 42
// => 56
// => 78