【发布时间】:2014-07-28 07:17:59
【问题描述】:
我刚接触 promise 的世界,我不确定我是否完全理解在某些情况下如何使用它们。
Sequelize 最近添加了对 Promise 的支持,这确实使我的代码更具可读性。一个典型的场景是避免在无限回调中多次处理错误。
下面的 sn-p 总是返回204,而我希望它在找不到照片时返回404。
有没有办法告诉 Sequelize 在发送 404 后“停止”承诺链的执行?请注意,res.send 是异步的,因此它不会停止执行。
// Find the original photo
Photo.find(req.params.id).then(function (photo) {
if (photo) {
// Delete the photo in the db
return photo.destroy();
} else {
res.send(404);
// HOW TO STOP PROMISE CHAIN HERE?
}
}).then(function () {
res.send(204);
}).catch(function (error) {
res.send(500, error);
});
当然,这个例子很简单,可以很容易地用回调来编写。但在大多数情况下,代码会变得更长。
【问题讨论】:
-
您需要一种方法来将承诺标记为此时已解决。我不熟悉 sequelize,但我认为一定有办法做到这一点。
-
谢谢埃德温。我唯一知道的是 Sequelize 使用的是 Bluebird。但是,我在他们的 API 中看不到任何可以让我停止承诺链的内容。
-
如果您在
throw处理程序中使用throw,则会拒绝该链。还有一个(未解决的问题)[github.com/sequelize/sequelize/issues/272],如果未找到结果,则自动拒绝 find 调用。如果您需要该功能,您可以在那里表达您的支持 -
听起来不错!我今天将添加评论。现在,投掷似乎也是一个很好的后备。谢谢你的回答:)
-
好的,我发布了一个相关的拉取请求并得到了我的最终答案。看起来最好的解决方案是按照您的建议在
then内使用throw。 github.com/sequelize/sequelize/pull/934
标签: javascript node.js express sequelize.js