done()和Javascript promises中的catch()一样(使用sequelize和bluebird)吗

Does done() accomplish the same thing as catch() in Javascript promises (using sequelize and bluebird)?

本文关键字:使用 sequelize bluebird 一样 中的 Javascript promises done catch      更新时间:2023-09-26

我正试图使我的Express应用程序尽可能地处理所有请求。我有一个处理所有回调的服务器,而厄运金字塔非常糟糕。我也很难保证我给所有的电话都发了回复。

所以我迁移到一个基于Promise的系统(sequelize,它利用了bluebird的Promise库)。

我读到过,最好总是跟进.catch(function(err){ report it }电话。

.done()完成同样的事情吗?

我的想法(可能是天真的)是我可以处理.done(success, failure)函数中的所有res.status(x).send(y)调用。

failure会捕获catch()会捕获的所有内容吗?在done()函数中发送所有响应(success中的所有成功消息和failure中的所有失败/错误消息)是错误的吗?

编辑-我发现sequelize使用蓝鸟的承诺库,所以done()已经被finally()弃用。但是,finally()在函数中不接受参数,所以我似乎不能将所有数据发送到finally()并在那里处理它。

done()已被弃用,我建议您不要使用它-它的目标是将拒绝作为异常抛出,以便它传播。Bluebird会自己跟踪未解决的承诺,所以then会这样做并发出警告。

你做想做.catch(err => { /* handle */}),除非你真的有能力处理异常-就像catch (e) {。如果你对异常没有任何有意义的处理,就不要做任何事情。

例如,在路由中,如果发生异常,您可以返回500错误状态,并向您的工具和客户端报告一些内容。

finally()主要用于资源清理,并确保您将所有内容保持在干净的状态。

原生承诺没有.done()方法。我建议坚持使用ECMAScript规范,只使用.then(success).catch(failure),这将确保在success函数中抛出的任何错误仍然会被failure函数捕获和处理。

.finally(function() handler) -> Promise函数略有不同。它被successfailure调用,但请注意,它没有获得任何数据作为handler的参数。

用于清理,就像try...catch中的普通finally块一样。

如果你需要访问Promise返回的值,使用.then():

.then(
    [function(any value) fulfilledHandler],
    [function(any error) rejectedHandler]
) -> Promise