Лучший способ выполнить обещание nodejs - PullRequest
0 голосов
/ 08 июня 2018

Я новичок в nodejs и обещаниях.Это код, который я написал, прочитав некоторые статьи, но я чувствую, что не на верном пути.

Проблема: - В getManager () иногда neo4j db выдает ошибку во время выполнения запроса, поэтому элемент управления оказывается в блоке catch.Однако обещание так или иначе не будет решено после этого.Поэтому я не уверен, нужно ли мне вызывать deferred.reject (returnResults) в блоке catch.

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) Является ли хорошей практикой deferred.reject (returnResults) в блоке catch метода getManager ()?

2) Любые другие изменения шаблона или кода, которые я должен выполнить в соответствии с рекомендациями?.

1 Ответ

0 голосов
/ 08 июня 2018
  1. Является ли хорошей практикой deferred.reject (returnResults) в блоке catch функции getManager ()?

    Нет, никогда не отклоняйте ничего, что не является причиной отклонения.


Любые другие изменения в шаблоне или коде, которые я должен сделать согласно рекомендациям?.

  • В session.then(...), session.close(); никогда не будет выполняться после оператора return.

  • Вам не нужно встраивать логику session.run(...) в query().Кроме того, если session.run().then().catch() вернет Promise, вы можете просто вернуть его напрямую вместо инициализации нового обещания и явного разрешения / отклонения.

  • error в session.catch(...)должен обрабатываться deferred.reject, а не просто записывать его в консоль.

  • Если вы не используете древний Node.js, у него должно быть собственное обещание, вы ненужно использовать «Q».

Вот как я бы реализовал getManager:

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);
    }
}
...