конвертировать cps в Promise в node.js Javascript - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий метод в node.js с использованием cps:

exports.execute = function (input, callback) {
    var config = {...};
    var conn = mysql.createConnection(config);

    conn.connect(function (err) {
        if (null !== err) {
            var message = {
                "level": "error",
                "message": err
            };
            console.log(message);
            callback(JSON.stringify(message));
        }
    });


   /* cps for async */
    cps.seq([
        /**
         * @function
         * @name validate
         * @param _
         * @param handle
         */
        function (ignore, handle) {
            if (null !== input.test) {
                conn.query(input.test.query, handle);
            } else {
                handle(null, null);
            }
        },
        /**
         * @function
         * @name query
         * @param res
         * @param handle
         */
        function (res, handle) {
            if ((null === res && null === input.test) || true === input.test.validate(res)) {
                if (input.query !== null) {
                    conn.query(input.query, handle);
                } else {
                    handle(null, null);
                    return;
                }
            } else {
                var message = {
                    "level": "error",
                    "message": input.test.error
                };
                console.log(message);
                callback(JSON.stringify(message));
                conn.end();
                return;
            }
        },
        function (res, handle) {
            console.log("[RDS-BASE] Executing input action");
            handle(null, input.action(res));
        },
        function (res, ignore) {
            console.log("[RDS-BASE] Executing response");
            if (null === res) {
                var message = {
                    "level": "error",
                    "message": "Missing result"
                };
                console.log(message);
                callback(JSON.stringify(message));
                conn.end();
                return;
            }
            callback(null, res);
            conn.end();
            return;
        }
    ], handle);
};

Как я могу провести рефакторинг своего кода, используя Promise или любым другим способом заменить cps функциональные возможности.

1 Ответ

0 голосов
/ 16 мая 2018

Первым шагом является обещание вызываемых функций стиля cps: conn.connect и conn.query

Вы можете использовать util.promisify для этого

const { promisify } = require('util');
. . .
conn.connect = promisify(conn.connect);
conn.query = promisify(conn.query);

Затем вы можете использовать async / await для оптимизации вашего кода

exports.execute = async function (input) {
    . . .
    await conn.connect();
    let res = await conn.query(input.test.query);
    . . .
}

Затем, когда вы хотите использовать execute, вы можете использовать .then / .catch или обернуть его в async / await

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...