Отказ от ответственности: это продолжение для предыдущего безопасного обновления для 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 Data.Either
, и передать его вместо скалярных удвоений.
Мысли?
UPD: Да, я читал Обработка исключений в реактивных расширениях без остановки последовательности, но я все еще надеюсь, что есть лучшие способы.