done() 是否完成与 Javascript 承诺中的 catch() 相同的事情(使用 sequelize 和 bluebird)?

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

我正在尝试让我的 Express 应用程序尽可能类似地处理所有请求。我有一台服务器,它通过回调处理所有事情,厄运金字塔太可怕了。也很难确保我对所有呼叫都发送了响应。

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

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

.done()是否完成了同样的事情?

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

failure 会捕捉到 catch() 会捕捉到的一切吗?在done()函数中发送所有响应是否错误(success中的所有成功消息和failure中的所有failure/error消息?

编辑 - 我发现 sequelize 使用 bluebird 的 promise 库,因此 done() 已被删除 finally()。但是,finally() 在函数中不带参数,所以我似乎无法将所有数据发送到 finally() 并在那里处理。

Native Promises 没有 .done() 方法。我建议坚持使用 ECMAScript spec 并只使用 .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

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

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

例如,在路线中,如果发生异常,您可以 return 一个 500 错误状态,并向您的工具和客户端报告一些事情。

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