首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理nodejs承诺的最佳方式

处理nodejs承诺的最佳方式
EN

Stack Overflow用户
提问于 2018-06-09 03:47:13
回答 1查看 209关注 0票数 -1

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

问题:- getManager()中的有时在运行查询时neo4j db会抛出错误,因此控制在catch块中结束。然而,不知何故,promise在那之后将不会被解决。所以我不确定是否需要在catch块中调用deferred.reject(returnResults)。

1)机器人对话消费者:调用getPersonInfo()

代码语言:javascript
复制
helper.getPersonInfo(personFullName)
    .then(function(results) {
        if (results && results.length >= 1) {
            //Do something.
        } else {
            //Do something.
        }
    })
    .catch(function(error) {
        //Do something
    });

2) getPersonInfo()的外观:

代码语言:javascript
复制
getPersonInfo: function(fullname) {
    return Promise.all([
                    personService.getManager(firstname, fullname, operatorId),
                    personService.getTeamsMates(firstname, fullname, operatorId)
                ]);
}

3) promise.all()上的一个方法看起来是什么样子:

代码语言:javascript
复制
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()的deferred.reject块中捕获(ReturnResults)是一种好的做法吗?

2)根据最佳实践,我应该对其他模式或代码进行更改吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 04:28:47

  1. 在getManager()的deferred.reject块中捕获(ReturnResults)是一种好的做法吗?

不,永远不要拒绝任何与拒绝原因无关的东西。

  1. 我应该按照最佳实践进行的任何其他模式或代码更改吗?

代码语言:javascript
复制
- In `session.then(...)`, `session.close();` will never execute after the `return` statement.
- You don't have to embed the `session.run(...)` logic in `query()`. Also, if `session.run().then().catch()` will return a `Promise`, you can just return it directly instead of initializing a new promise and resolving/rejecting explicitly.
- `error` in `session.catch(...)` should be handled by `deferred.reject` as well instead of just logging it to console.
- If you are not using the ancient Node.js, it should have native promise, you don't have to use "Q".

这就是我实现getManager的方式

代码语言:javascript
复制
getManager : function (fullname) {
    // ideally, `fullname` should be checked before calling this function
    // if this function is only for private use and totally controllable.
    if (fullname) {
        // only initialize variables when necessary
        const returnResults = [];
        const session = graphDBDriver.session();
        const cypherQuery = "Neo4j Query";
        return session
            .run(cypherQuery, {
                fullname: fullname
            })
            .then(function(result) {
                result.records.forEach(function(record) {
                    if (record && record.length >= 1) {
                        returnResults.push(record);
                    }
                });
                session.close();
                // `return value` in `.then()` is similar to `resolve(value)`
                return returnResults;
            })
            .catch(function(error) {
                session.close();
                console.log(" Neo4j error from getManager: " + error);
                // `throw value` in `.catch()` is similar to `reject(value)`
                // throw it so that it can be caught
                throw error;
            });
    } else {
        const error = new Error('`fullname` is required');
        // always return a promise
        return Promise.reject(error);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50767508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档