javascript promise 池化连接并执行查询

标签 javascript node.js asynchronous promise

我想知道这种方法是否正确或者是否需要进一步改进,也许是 promisify 自定义 mySQL getConnection还有方法???

    request: function(queryRequest) {
        return new Promise(function(resolve, reject){
            Database.getConnection(function(error, connection){
                if(error) {
                    reject({error: error, queryRequest: queryRequest});
                } else {
                    connection.query(queryRequest.sql, queryRequest.values, function(error, rows, fields){
                        if(error) {
                            reject({error: error, queryRequest: queryRequest});
                        } else {
                            resolve({rows: rows, fields: fields, queryRequest: queryRequest});
                        }
                    });
                }
            });
        });
    },

getConnection Database中定义的方法模块。

    getConnection: function(callback) {
        this.pool.getConnection(function(error, connection){
            callback(error, connection);
        });
    },

最佳答案

maybe promisify custom mySQL getConnection method as well?

只是也许。虽然它可以被认为更干净一些,并且使您的回调金字塔更平坦一些,但它并没有对代码进行太多改进:

function request(queryRequest) {
    return new Promise(function(resolve, reject) {
        Database.getConnection(function(error, connection) {
            if (error)
                reject(error);
            else
                resolve(connection);
        });
    }).then(function(connection) {
        var res = new Promise(function(resolve, reject) {
            connection.query(queryRequest.sql, queryRequest.values, function(error, rows, fields) {
                if (error)
                    reject(error);
                else
                    resolve({rows: rows, fields: fields, queryRequest: queryRequest});
            });
        });
        return res;
    }).catch(function(error) {
        throw {error: error, queryRequest: queryRequest};
    });
}

I'm wondering if this approach is correct

对于数据库连接,您可能需要查看 disposer pattern 。如果您不需要它,您仍然应该记住始终释放您的连接,使用类似

….then(function (connection) {
    var res = …;
    // better be solved using `finally` where supported
    return res.then(end, end);
    function end() {
        connection.release();
        return res;
    }
})

此外,拒绝没有 Error 的对象的 Promise 是一种不好的做法,你最好这样做

….catch(function(error) {
    error.queryRequest = queryRequest;
    throw error;
})

或原始模式中的等效内容。

关于javascript promise 池化连接并执行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31117414/

相关文章:

c# - 如何正确使用Microsoft.Bcl.Async?

javascript - 使用 javascript 正则表达式翻译 html

node.js - Neo4j Rest api 唯一性不起作用?

Javascript无限循环更新实体

asynchronous - Tornado 能否以非阻塞异步方式与 Cassandra 通信?

asynchronous - Dart 中的 stdout.write() 显然已从同步更改为异步,但我该如何使用它?

javascript - 将第 3 方 JS 库导入 Angular 12 库

javascript - 4x4 Canvas 绘图中的逻辑错误

javascript - 同一页面中API对不同数据的不同请求,React(无Redux)

javascript - 当我尝试使用 npm i 安装我的项目包时出现错误