Результат операции PUT
против базы данных, иногда нормально, даже если он не возвращается как код HTTP 200
.Bacon.js поток с некоторыми хорошими ошибками
В этом конкретном случае я хочу обрабатывать 400
как еще одну хорошую ошибку, но изо всех сил пытаюсь придумать элегантный способ сделать это.
# stream from a promise any non 200 is fail
putter = Bacon.fromPromise @_exec 'PUT', '/some/resource', {}
errors = putter.errors().mapError(errBody) # now errors are normal values
badErrors = errors.filter(statusIsnt(400)).flatMap (body) ->
return new Bacon.Error body # and now they are errors again
okErrors = errors.filter(statusIs(400)).flatMap (body) -> {}
noError = putter.mapError().filter (v) -> v? # attempt to get rid of errors
Bacon.mergeAll noError, okErrors, badErrors # combine to get result stream
Я родом из фона обещания, и я считаю, выше несколько неуклюжие, что приводит меня к выводу, что я что-то не хватает. Сравните:
@_exec 'PUT', '/some/resource', {}
.fail (err) ->
if err.body.status == 400 # ok
return {}
else
throw err
Я думаю, что «лучший» ответ будет зависеть от того, что вы хотите сделать с результатом. Вы также можете посмотреть EventStream.subscribe, который получает все события, включая ошибки. Кроме того, я не думаю, что ваше сравнение справедливое, поскольку если бы все, что вы хотели сделать, это выбросить ошибки не 400, это было бы простое использование onError. – chreekat
Справедливая точка. Это код инициализации. Я хочу делать вещи в зависимости от успеха или неудачи. Обещание, которое я мог бы в этот момент просто направить на '. Then', чтобы продолжить после init, то же самое с' .onValue' из 'mergeAll'. Оба 200 ответа (которые заканчиваются на 'noError'), и эти« правильные »ошибки должны дать мне точку для продолжения после init. –