Bacon.js流有一些好的错误

时间:2014-12-28 05:42:17

标签: functional-programming bacon.js

对数据库执行PUT操作的结果有时可以正常,即使它没有作为HTTP代码200返回。

在这个特定情况下,我想将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

3 个答案:

答案 0 :(得分:1)

withHandler Bacon.Error throwBacon.Next隐含result promise = @_exec('PUT', '/some/resource', {}) recovered = promise.fail (err) -> # 400 is ok. make it ok already in promise if err?.body?.status == 400 then {} else throw err.body result = Bacon.fromPromise recovered 。但是代码看起来非常类似于你已经承诺的处理。实际上承诺版本的样板很少。

比较您的承诺版本

withHandler

promise = @_exec('PUT', '/some/resource', {}) stream = Bacon.fromPromise promise result = stream.withHandler (event) -> if (event.hasValue()) @push(event) else # error if event.error?.body?.status == 400 then @push({}) else @push(event) 培根只有""版本

{{1}}

答案 1 :(得分:0)

针对此特定情况的一种可能解决方案是修改承诺中已有的结果,但我可以轻松地设想您无法做到的情况。

Bacon.fromPromise @_exec('PUT', '/some/resource', {}).fail (err) ->
    # 400 is ok. make it ok already in promise
    if err?.body?.status == 400 then {} else throw err.body

肯定有一个更好的功能方法来解决这个问题吗?

答案 2 :(得分:0)

withHandler是一种基础方法,可让您对所有类型的事件进行操作。在其中你可以调用@push,它会将错误发送到错误流,并将值发送到值streeam。也许如下:

Bacon.fromPromise(@_exec('PUT', '/some/resource', {}))
    .withHandler((event) ->
        if event.isError && event.error.body?.status? == 400
            @push(new Bacon.Next({}))
        else
            @push(event)
    )