我有这样的设计:

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));
}


那时的方法可能会拒绝。我希望在发生拒绝之后,除了最后一个.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”中不传递任何参数。我是否了解此链条有问题?

还有一个问题:这个设计是好的样式吗?还是有其他/更好的最佳实践?

最佳答案

如果checkData()是在Promise链的开头,则需要像您的own answer中那样编写它,并返回一个明确的Promise。

在中间链中,也可以像这样编写,但是中间链为您提供了更好的编写内容选择。

更具体地说,您可以通过以下方式避免创建和返回承诺的需要:


抛出而不是返回被拒绝的承诺,
返回数据,而不是承诺包装的数据。


因此,只要在其他地方从未使用checkData()来启动承诺链,就可以这样编写:

 

var checkData = function(args) {
    var fields = args[0],
        files = args[1],
        file = args[1].uploadedFile0,
        secondFile = args[1].uploadedFile1;
    if(file.type !== "application/javascript") {
        throw new Error("please only upload javascript-files"); // always throw an Error object, thus emulating a natural Error. This error will percolate down to the `.fail(onUploadFailed.bind(this, res))` handler.
    }
    (...)
    return [fields, file]; // the next step in the chain will assimilate a promise or data.
}

关于javascript - 延迟链接,Node.js和q,所有链部分的单个ErrorHandler,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39793164/

10-09 20:09