【发布时间】:2016-09-30 13:51:28
【问题描述】:
我有这样的设计:
var postCommand = function(req, res){
parseForm(req)
.then(checkData)
.then(findCommand)
.then(initializeCommand)
.then(saveToDb)
.then(onUploadSucceeded.bind(this, res))
.fail(onUploadFailed.bind(this, res));
}
then 中的方法可能会被拒绝。我希望在发生拒绝后不再执行任何操作,但最后一个 .fail 。
我的“checkData”看起来像这样(是的,它是链中唯一的同步部分):
var checkData = function(args){
var deferred = q.defer();
var fields = args[0];
var files = args[1];
var file = args[1].uploadedFile0;
var secondFile = args[1].uploadedFile1;
if(file.type !== "application/javascript"){
return deferred.reject("please only upload javascript-files");
}
(...)
return deferred.resolve([fields, file]);
}
即使调用了 deferred.reject,我最终还是会在没有传递参数的情况下进入“findCommand”。我理解这条链有什么问题吗?
还有一个问题:这种设计是一个好的模式吗?还是有其他/更好的最佳做法?
【问题讨论】:
-
您真的应该在您的承诺的每个
then(...)声明中进行响应验证。如果响应不包含预期的内容,那么您将破坏承诺链。 -
但是每个失败回调都会做同样的事情......调用“onUploadFailed”并将错误传递给拒绝。这在我看来就像代码重复并降低了可读性。我想抛出一个异常而不是拒绝,因为 q-documentation 说“catch”方法捕获了上述链的任何错误。不过好像有点臭
-
我使用的是 bluebird,所以我不确定,但我认为您应该在所有情况下都返回 deferred.promise。
-
这成功了!我想知道为什么我没有尝试。谢谢(见下面我的回答)
-
我认为应该避免使用 Q,以免为时已晚。如果不是承诺,
deferred.resolve(42)会返回什么?
标签: javascript node.js promise q deferred