【问题标题】:How to avoid deferred antipattern [duplicate]如何避免延迟反模式
【发布时间】:2016-06-27 23:50:55
【问题描述】:

很难用我能找到的信息来学习如何避免延迟的反模式。我正在为 Nodejs 使用 Q 库。

由于可以阅读,基本上,我们必须尽量不拒绝或回答带有 deferred.reject 或 deferred.resolve 的承诺。

deferred.resolve 必须替换为 return 语句,所以这一点很简单。

当我想在函数中使用 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 未知。

如果可能,我如何在不使用 deferred 的情况下管理这种代码?谢谢。

【问题讨论】:

  • 查询是异步操作吗?如果是这样,那么您通过返回一个承诺来做正确的事情。否则,不要返回承诺。
  • 您能否明确说明您引用的延迟反模式?我真的很好奇你想避免什么。 Promise 是避免回调地狱的工具。

标签: javascript node.js promise q


【解决方案1】:
isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => {
    var deferred = Q.defer();

    //DO A QUERY AND STORE IN result PARAM

此时,假设“QUERY”是一个异步操作,你会得到一个promise。因此,您可能不需要创建另一个承诺,只需重用来自“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;
}

【讨论】:

    【解决方案2】:

    我不知道 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 功能,否则我宁愿使用原生 Promises。

    【讨论】:

    • 如果你的 //DO A QUERY AND STORE IN result PARAM 是异步的,它会得到一个 await 并且 Promise 构造函数参数也需要是一个异步函数。但这将是反模式的一个指标。 [1]你将如何规避这一点? [1]stackoverflow.com/questions/43036229/…
    猜你喜欢
    • 2015-04-30
    • 2012-02-03
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2016-02-24
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多