我在解释这个(和onErrorResumeNext
)如何运作时遇到了自己的问题。我遇到的难题是 catch (或resume next)适用于什么上下文。对我来说有意义的简单口语翻译如下:
给定一个可观察对象的流(或可观察对象),catch
(或onErrorResumeNext
)将消耗错误并允许您提供一个或多个可观察对象以继续原始流。
关键是您的原始来源被中断并替换为您在catch
/onErrorResumeNext
函数中提供的可观察对象。这意味着如果你有这样的事情:
var src = Rx.Observable
.interval(500)
.take(10)
.select(function(x) {
if (x == 5) {
return Rx.Observable.throw('Simulated Failure');
}
return Rx.Observable.return(x * 2);
})
然后添加.catch(Rx.Observable.return('N/A'))
or.onErrorResumeNext(Rx.Observable.return('N/A'))
实际上不会继续您的流(由 提供interval
),而是以最终的 observable(N/A
)结束流。
如果您希望优雅地处理故障并继续原始流,您需要这样的东西更像.select(function(x) { return x.catch(Rx.Observable.return('N/A')); })
. 现在,您的流将替换流中任何因捕获的默认值而失败的可观察元素,然后继续使用现有的源流。
var src = Rx.Observable
.interval(500)
.take(10)
.select(function(x) {
if (x == 5) {
return Rx.Observable.throw('Simulated Failure');
}
return Rx.Observable.return(x * 2);
})
//.catch(Rx.Observable.return('N/A'))
//.onErrorResumeNext(Rx.Observable.return('N/A'))
.select(function(x) { return x.catch(Rx.Observable.return('N/A')); })
.selectMany(function(x) { return x; });
var sub = src.subscribe(
function (x) { console.log(x); },
function (x) { console.log(x); },
function () { console.log('DONE'); }
);
// OUTPUT:
// 0
// 2
// 4
// 6
// 8
// N/A
// 12
// 14
// 16
// 18
// DONE
这是一个JSFiddle,它显示了这一点。