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