Express 如何有选择地处理承诺链中的异步错误?

Express 如何有选择地处理承诺链中的异步错误?,express,coffeescript,promise,Express,Coffeescript,Promise,无法计算如何有选择地处理承诺链中的错误 我不确定什么时候我应该返回一个新的承诺(使用new或promise.reject或promise.emply),如何打破链条(return-promise.reject或throw?),以及哪个拒绝被.done捕获,以及如何只处理.done中的一些错误 (本地化会很好,也就是说,避免全局变量,就像我以前在回调地狱中做的那样。此外,除非集体处理,否则请保持错误处理接近原因。) 上下文:“/save”的快速路由处理程序,逻辑有点复杂,可以选择promisifi

无法计算如何有选择地处理承诺链中的错误

我不确定什么时候我应该返回一个新的承诺(使用new或promise.reject或promise.emply),如何打破链条(return-promise.reject或throw?),以及哪个拒绝被.done捕获,以及如何只处理.done中的一些错误

(本地化会很好,也就是说,避免全局变量,就像我以前在回调地狱中做的那样。此外,除非集体处理,否则请保持错误处理接近原因。)

上下文:“/save”的快速路由处理程序,逻辑有点复杂,可以选择promisified LevelDB

promise=require 'promise' # (Capitalize Promise in anticipation of ES6?)
db=(require 'level-promise') sub (require 'level') './data',keyEncoding:'utf8',valueEncoding:'json'
简化的未经测试的伪代码(显然是CoffeeScript),例如:

谢谢


附言:似乎有帮助,但我还没有消化。似乎建议我需要添加。链内的陷阱?但是建议你抓住内心的承诺。我最终抛出/拒绝来打破这个链条,并依靠done/catch显式地接收异常/拒绝值来区分未处理的“异常”:


显然,目前还没有更好的控制流结构可用?

似乎可以回答这个问题,但使用了Bluebird而不是promise模块,所以我不确定…promise模块:我的答案在这里同样适用,您可以使用它。此外,你应该考虑不使用承诺模块,而使用蓝鸟代替-它快得多,并给出了更好的堆栈跟踪。
.post '/save',(req,res)->
    new promise ->
        # Validations… Sync stuff.
        unless req.body.role then return promise.reject res.send 400,'Missing role.'
        # Etc.
        promise.fulfill()
    .then ->
        # Permissions, similarly, but 403...

    .then ->
        # But what about async stuff?
        # If changing username, ensure availability.
        return new promise (fulfill,reject)->
            if key_change
                db.get r.username,(err,v)-> # Why not promisified/denodeify?!
                    unless err?.notFound then reject res.send 400,'Username already taken.' # Throw instead?
                    else
                        changes.push type:'del',key:r.current_username
                        fulfill() # ?
            else fulfill() # ?
            # Or .catch here?

    # .catch here?
    .then ->
        # Etc.
    .then ->return db.batch changes # Promisified?

    # Error handling for everything (that wasn't already).
    .done ->res.send 200,'Saved.'
    ,-> # Which rejection caught here?
        res.send 500,'Oops...'

    # Or better?
    .then ->res.send 200,'Saved.'
    .catch -> # Which rejection caught here?
        res.send 500,'Oops...'
    .done() # Because catch doesn't end chain?