我有一个要解析的项列表,但其中一个项的解析可能会失败。
捕获错误但继续执行序列的"接收方式"是什么
代码示例:
var observable = Rx.Observable.from([0,1,2,3,4,5])
.map(
function(value){
if(value == 3){
throw new Error("Value cannot be 3");
}
return value;
});
observable.subscribe(
function(value){
console.log("onNext " + value);
},
function(error){
console.log("Error: " + error.message);
},
function(){
console.log("Completed!");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
我想以非处方的方式做什么:
var items = [0,1,2,3,4,5];
for (var item in items){
try{
if(item == 3){
throw new Error("Value cannot be 3");
}
console.log(item);
}catch(error){
console.log("Error: " + error.message);
}
}
5条答案
按热度按时间qyzbxkaa1#
我建议您使用
flatMap
(现在rxjs版本5中的mergeMap
),如果您不关心错误,它将允许您折叠错误。你将创建一个内部的可观察对象,如果发生错误,它可以被吞噬。这种方法的优点是,您可以将运算符链接在一起,如果管道中的任何位置发生错误,它将自动转发到挡块。ws51t4hk2#
您需要切换到一个新的可处理流,如果其中发生错误,则将安全地处理该流,并保持原始流处于活动状态:
有关此技术的更多信息,请参阅此博客文章:The Quest for Meatballs: Continue RxJS Streams When Errors Occur
5q4ezhmt3#
为了防止
endlessObservable$
失效,可以将failingObservable$
放入一个高阶Map运算符(例如switchMap
、concatMap
、exhaustMap
...)中,并通过使用empty()
observable(不返回任何值)终止内部流来消 debugging 误。使用RxJS 6:
pvcm50d14#
如果你不想或无法访问导致错误的内部可观察性,你可以这样做:
使用RxJS 7:
这里有趣的是可以返回的catchError运算符中的"catch"参数。https://rxjs.dev/api/operators/catchError
它仅在可观测源为热时有效。
在我的例子中,我使用redux-observable,我希望有一种方法在一个地方处理我的错误。
我想到了这个:
如果我的任何史诗抛出"MyError"异常,它将被捕获,另一个动作将被调度.
fjaof16o5#
实际上,您可以在map函数中使用try/catch来处理这个错误。