我来自iOS领域,我广泛使用ReactiveCocoa。在RAC中,当tryMap
操作失败时,sendError
运算符为map
。
Rx.JS中是否有等价物?我可以使用flatMap
和另一个Observable
来模仿类似的行为,但这看起来确实有点过分。
谢谢!
答案 0 :(得分:4)
Brandon的回答解释了捕获错误并通过onNext
流传递错误的好方法。
我最初的问题是简单地结束流并传播Error
,这显然在RxJS中很好地实现了throw
map
操作块内的异常try {} catch {}
。我猜测RxJS将整个操作包装在Error
块中,并通过向下发送throw
流来优雅地处理异常。
我写这个作为来自ReactiveCocoa的人的参考,由于Swift
语言限制不允许例外,目前的实现不允许Observable.just(1)
.map(num => { if (num == 1) { throw new Error('error') } return num; })
.subscribeOnError(console.log) // prints 'error'
这是在Swift 2中修复的。
class
答案 1 :(得分:0)
我假设您希望在映射操作失败时不结束流?我不认为它内置了RxJS,但写起来相当容易。您只需捕获错误并让tryMap
基本上返回Either
类型的构造,该构造可能是错误或映射结果:
Rx.Observable.prototype.tryMap = function(selector) {
var mapSelector = function(value, index, obs) {
try {
return {
value: selector(value, index, obs)
};
} catch (e) {
return {
error: e
};
}
};
return this.map(mapSelector);
};
// Usage:
Rx.Observable
.of(1, 2, 3, 4, 5)
.tryMap(function(v) {
if ((v % 2) === 1) {
throw new Error("odd numbers are evil");
}
return v / 2;
})
.subscribe(function(result) {
if (result.error) {
console.log("error: " + result.error.message);
} else {
console.log("result: " + result.value);
}
});
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<script src="https://rawgit.com/Reactive-Extensions/RxJS/master/dist/rx.all.js"></script>