对数据库执行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
答案 0 :(得分:1)
withHandler
Bacon.Error
throw
和Bacon.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)
)