处理nodejs承诺的最佳方法

时间:2018-06-08 19:47:13

标签: node.js promise q deferred

我是nodejs和promises的新手。这是我通过阅读一些文章写的代码,但我觉得我没有正确的道路。

问题: - 在getManager()中,有时neo4j db在运行查询时会抛出错误,因此控件最终会出现在catch块中。但是,在那之后某种程度的承诺将无法解决。所以我不确定是否需要打电话 catch块中的deferred.reject(returnResults)。

1)BOT对话消费者:调用getPersonInfo()

helper.getPersonInfo(personFullName)
    .then(function(results) {
        if (results && results.length >= 1) {
            //Do something.
        } else {
            //Do something.
        }
    })
    .catch(function(error) {
        //Do something
    });

2)getPersonInfo()看起来如何:

getPersonInfo: function(fullname) {
    return Promise.all([
                    personService.getManager(firstname, fullname, operatorId),
                    personService.getTeamsMates(firstname, fullname, operatorId)
                ]);
}

3)promise.all()上的方法之一如何: -

var Q = require('q')

getManager: function(fullname) {
    let session = graphDBDriver.session();
    let deferred = Q.defer();
    let query = function() {
        let returnResults = [];
        if (fullname) {

            let cypherQuery = "Neo4j Query"

            session
                .run(cypherQuery, { fullname: fullname })
                .then(function(result) {
                    result.records.forEach(function(record) {
                        if (record && record.length >= 1) {
                            returnResults.push(record);
                        }
                    });

                    return deferred.resolve(returnResults);

                    session.close();

                })
                .catch(function(error) {
                    session.close();
                    console.log(" Neo4j error from getManager: " + error);


                });
        } else {
            return deferred.reject(returnResults);
        }
    }
    query();
    return deferred.promise;
}

问题: -

1)在getManager()的catch块中deferred.reject(returnResults)是一个好习惯吗?

2)根据最佳实践我应该做的任何其他模式或代码更改?。

1 个答案:

答案 0 :(得分:2)

  1. 在getManager()的catch块中deferred.reject(returnResults)是一个好习惯吗?

    不,永远不要拒绝任何与拒绝理由无关的事情。

    1. 根据最佳做法,我应该做哪些其他模式或代码更改?。

      • SET XACT_ABORT ON 中,session.then(...)永远不会在session.close();声明后执行。

      • 您无需在return中嵌入session.run(...)逻辑。此外,如果query()将返回session.run().then().catch(),您可以直接返回,而不是初始化新承诺并明确解决/拒绝。

      • Promise中的error也应由session.catch(...)处理,而不是仅将其记录到控制台。

      • 如果您没有使用古老的Node.js,它应该具有原生承诺,您不必使用“Q”。

    2. 这是我实施deferred.reject的方式:

      getManager