done()完成与Javascript承诺中的catch()完全相同的事情(使用sequelize和bluebird)?
我试图让我的Express应用程序尽可能相似地处理所有请求。 我有一个服务器,处理所有的callback和厄运金字塔是可怕的。 我也很难确保所有的电话都有回应。
所以我正在迁移到基于Promise的系统(sequelize,它利用蓝鸟的承诺库)。
我读过最好总是跟进一个.catch(function(err){ report it }
调用。
.done()
完成相同的事情?
我的想法(可能是天真的)是,我可以在.done(success, failure)
函数中处理所有res.status(x).send(y)
调用。
failure
抓住一切catch()
会(? 在done()
函数中发送所有响应是否错误(所有成功消息都success
,所有失败/错误消息failure
?
编辑 – 我发现sequelize
使用蓝鸟的诺言库,所以done()
已被depricted finally()
。 但是, finally()
没有在函数中使用参数,所以似乎我不能将所有数据发送到finally()
并在那里处理它。
done()
已被弃用,我build议你不要使用它 – 它的目标是把拒绝作为一个exception来传播。 蓝鸟自己跟踪未解决的承诺, then
这样做,并警告无论如何。
你不想做.catch(err => { /* handle */})
除非你真的有能力处理exception – 就像catch (e) {
。 如果你没有任何有意义的事情做例外,不要做任何事情。
例如,在路由中,如果发生exception,则可以返回500
错误状态,并向您的工具和客户端报告某些内容。
finally()
主要用于资源清理 ,并确保您将所有内容保留在干净的状态。
Native Promises没有.done()
方法。 我会build议坚持使用ECMAScript规范 ,只使用.then(success).catch(failure)
这将确保可能在您的success
函数中引发的任何错误仍然被捕获并由您的failure
函数处理。
.finally(function() handler) -> Promise
函数略有不同。 它被success
和failure
调用,但注意到它没有得到任何数据作为handler
的参数。
它的目的是用于清理,就像一个正常的try...catch
finally
块。
如果您需要访问Promise返回的值,请使用.then()
:
.then( [function(any value) fulfilledHandler], [function(any error) rejectedHandler] ) -> Promise