Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在node.js Javascript中将cps转换为Promise_Javascript_Node.js_Promise - Fatal编程技术网

在node.js Javascript中将cps转换为Promise

在node.js Javascript中将cps转换为Promise,javascript,node.js,promise,Javascript,Node.js,Promise,我在node.js中使用cps使用以下方法: exports.execute = function (input, callback) { var config = {...}; var conn = mysql.createConnection(config); conn.connect(function (err) { if (null !== err) { var message = { "l

我在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
功能。

第一步是提示您调用的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时,可以使用
。然后
/
。catch
或将其包装为
异步
/
等待