免责声明:它是先前安全更新 2 个依赖流问题的延续
在允许流不终止的 RxJS(或任何其他 RX 实现)中处理错误的惯用方法是什么?
相关代码是
function convert(unit, value) {
var request = {};
request[unit] = value;
var conversion = $.ajax({
method: 'POST',
url: './convert.php',
data: request,
dataType: 'json'
}).promise();
return Rx.Observable.fromPromise(conversion).takeUntil(inInput.merge(cmInput));
}
var cmElement = document.getElementById('cm'),
inElement = document.getElementById('in');
var cmInput = Rx.Observable.fromEvent(cmElement, 'input').map(targetValue),
inInput = Rx.Observable.fromEvent(inElement, 'input').map(targetValue);
var inches = cmInput
.flatMap(convert.bind(null, 'cm'))
.startWith(0);
var centimeters = inInput
.flatMap(convert.bind(null, 'in'))
.startWith(0);
如您所见,我们使用输入字段更改流并将其传递给convert
将其转换为另一个单元并进一步传递结果的函数。
如果在$.ajax()
调用期间发生错误,那么它会向上传播并且整个inches
或cetimeters
流停止(实际上是预期的)。
但是我将如何实现它不这样做呢?
这样我就可以优雅地处理错误,例如显示错误消息并在新数据到达时重试?
我目前的想法是引入像 Haskell's 这样的复合类型Data.Either
并将其流式传输而不是标量双精度数。
想法?
UPD:是的,我已经阅读了在响应式扩展中处理异常而不停止序列,但我仍然希望有更好的方法。