如何避免延迟反模式

时间:2016-06-27 15:38:38

标签: javascript node.js promise q

我很难学会如何使用我能找到的信息来避免延迟反事工。我正在使用Q库来创建Nodejs。

由于可以阅读,基本上,我们试图不拒绝或回答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未知。

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

2 个答案:

答案 0 :(得分:0)

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

    //DO A QUERY AND STORE IN result PARAM

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

    return yourAsyncQuery();

或者,如果你需要在“QUERY”的结果中添加内容,那么你必须给它一个回调来在它完成时执行。在回调中,您解决或拒绝承诺(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;
}

答案 1 :(得分:0)

我不知道Q是怎样的,但是你可以按照以下原则做出本机承诺:

isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => 
    new Promise((resolve, reject) => {
        //DO A QUERY AND STORE IN result PARAM
        if(err){           
          reject(err);
        } else if(! result){
          reject(new Error('Query is empty.'));
        } else {
          resolve();
        }
    }

我猜Q应该是相似的。无论如何,除非你需要一个非常具体的Q功能,否则我宁愿使用本机Promise。