2013-07-18 2 views
2

Иногда я хочу отфильтровать определенные ошибки в потоке. Я хотел бы написать что-то вроде этого:Как фильтровать ошибки в потоке Bacon.js

stream 
    .filterError (error) -> 
    error.type is 'foo' 

Но нет filterError метода.

В качестве альтернативы я подумал, что могу использовать errors().mapError, чтобы отображать ошибки в значениях, фильтровать их, а затем сопоставлять их с ошибками. Однако я не вижу способа преобразования значения в поток в ошибку.

# Filter only the errors we are interested in 
errors = stream.errors() 
    .mapError (error) -> 
    error 
    .filter (error) -> 
    ... 
    .mapValuesBackIntoErrors() # ?  

Идея состоит в том, что данный поток несет либо значение, либо ошибку. Оба представляют собой знание домена; значение означает, что система находится в нормальной работе, и ошибка означает, что мы имеем ошибку домена. Некоторые из ошибок домена не такие, что мы хотим их перенести, поэтому я хочу их отфильтровать.

+0

Считаете ли вы, что это ответили? ниже кажется странным. я могу полностью понять, откуда вы. –

ответ

1

Альтернативная работа, конечно же, и вы можете использовать комбинацию карты и mapError завернуть нормальные значения и ошибки в стиле Either типа в Haskell. Например

stream.map((value) -> { value }).mapError((error) -> { error }) 

Теперь ваш поток будет вывести что-то вроде этого:

{ value: 1 } 
{ value: 2 } 
{ error: "cannot connect to host" } 

С другой стороны, на самом деле реализации filterError не будет слишком сложно. Подумайте об этом и сделайте PR.

+0

Вы имели в виду реализацию 'filterError', правильно? – wolverian

+0

Может показаться странным, что фильтр filterError отфильтровывает ошибки и «mapError», который отображает ошибки в значения. 'mapError :: Error -> Error' чувствует себя более корректно для меня. – wolverian

+0

Я скорректировал его на "filterError", как вы предложили. MapError as is был добавлен с определенной целью, и я думаю, что он хорошо работает, даже если вы можете сначала сбить с толку. Какова будет ваша предложенная альтернатива? – raimohanska