This question already has answers here:
Is there a way to return early in deferred promise?
                                
                                    (2个答案)
                                
                        
                                3年前关闭。
            
                    
很难用我能找到的信息来学习如何避免推迟的反花粉。我正在为Nodejs使用Q库。

基本上,我们有可能会读到,我们必须尝试不拒绝或拒绝deferred.reject或deferred.resolve的诺言。

deferred.resolve必须替换为返回语句,因此这一点非常简单。

问题出在我想在函数中使用promise时,在某些情况下这不是应用程序错误,但必须拒绝执行。例如:

Services.data.isNotForbiddenFieldToUpdate(bodyKeys,forbidden)
.then(() => console.log('Finish'))


哪里

isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => {
    var deferred = Q.defer();

    //DO A QUERY AND STORE IN result PARAM

    if(err)           deferred.reject(err)
    else if(! result) deferred.reject(new Error('Query is empty.'));
    else              deferred,resolve();
    return deferred.promise;
}


在这种情况下,不可能返回与deferred.promise不同的东西。如果我删除它并返回true,则错误是then未知。

如果可能的话,如何在不使用延迟的情况下管理此类代码?谢谢。

最佳答案

isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => {
    var deferred = Q.defer();

    //DO A QUERY AND STORE IN result PARAM


此时,假设“ QUERY”是一个异步操作,您将获得一个诺言。因此,您可能无需创建另一个承诺,只需重复使用来自“ QUERY”的那个承诺即可。

    return yourAsyncQuery();


或者,如果您需要在“ QUERY”的结果中添加内容,则必须给它回调以在完成时执行。在该回调中,您可以解决或拒绝Promise(Q)。

    yourAsyncQuery().then(
        function(result) {
            if (! result)
                deferred.reject(new Error('Query is empty.'));
            // do more stuff with 'result'.
            deferred.resolve(result);
        },
        function(error) {
            deferred.reject(error);
        }
    );
    return deferred.promise;
}

关于javascript - 如何避免延缓反模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38058048/

10-16 07:53