【发布时间】:2017-01-04 03:22:21
【问题描述】:
我正在尝试让我的 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 使用 bluebird 的 promise 库,因此 done() 已被 finally() 贬低。但是,finally() 不接受函数中的参数,所以我似乎无法将所有数据发送到 finally() 并在那里处理。
【问题讨论】:
-
我在文档中没有看到任何
done函数,但我确实看到了then。你在使用 Promise 库吗? -
续集。我认为 done() 在 Promise 中是原生的,这可以解释为什么我在它上面找不到太多。
-
我也不太确定 Sequelize 是否有它。我仍然没有找到任何
done函数。你确定你没有使用像Q这样的库吗?done是 Promises 的非标准函数。不同的库以不同的方式实现它。一些图书馆无视failure。 -
我挖掘了 sequelize 的源代码,发现它是基于 bluebird 的 promise 库构建的。这意味着
done()已被贬低,我应该改用finally()。我认为...(编辑问题以反映这一发现) -
Bluebird 是 ES6 标准 Promise 的超集。您没有显示您的确切代码,因此我们可以更具体地响应您的情况,但通常,您会使用
someAsyncOperation().then(...).catch(...);。这在 ES6 标准 Promise 或 Bluebird Promise 中是正确的。.then()处理成功,.catch()处理错误。您也可以将第二个处理程序传递给.then()作为错误处理程序,但许多人发现使用.catch()处理错误更好。.finally()不同,Bluebird 文档对此进行了描述。我会避免.done()。
标签: javascript node.js express sequelize.js bluebird