【问题标题】:javascript promises for pooling connections and executing query用于池连接和执行查询的 javascript 承诺
【发布时间】:2015-09-16 00:26:59
【问题描述】:

我想知道这种方法是否正确或是否需要进一步改进,也许还可以承诺自定义 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});
                        }
                    });
                }
            });
        });
    },

Database 模块中定义的getConnection 方法。

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

【问题讨论】:

  • 啊,在我评论之前你已经修复了reject(error, queryRequest) :-)
  • 我推荐一个带有连接池的 disposer pattern 或 Promise 库的内置设施(using in bluebird)
  • node-mysql-promise 提供了node-mysql 的承诺版本。
  • 也就是说,这是基于意见的,所以我投票结束,欢迎您在此处的 JavaScript 聊天或 IRC 上的#promises 中讨论此问题。
  • 你用的是什么 promise 库?

标签: javascript node.js asynchronous promise


【解决方案1】:

也许也承诺自定义 mySQL getConnection 方法?

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

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

我想知道这种方法是否正确

对于数据库连接,您可能想查看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;
    }
})

另外,拒绝带有没有 Errors 的对象的承诺是一种不好的做法,你最好这样做

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

或原始模式中的等价物。

【讨论】:

  • 那么第二个中有一些分号重复,请检查。我阅读了有关处置器模式的信息,我们可以在第二次解析中使用connection.release() 吗? +1 error.queryRequest 建议
  • “分号重复”是什么意思?没有语法错误。
  • 很抱歉,这是正确的。鉴于处置器模式,您是否建议在第二次解析下使用connection.release
  • 是的,您可能应该在这个request 方法中包含connection.release。也许在一个额外的then 处理程序中,特别是如果它可以抛出。
  • 如果您每次都用connection 做不同的事情,那么处理器模式特别有用。 connection.query 是您唯一使用的东西,还是您还有其他调用 Database.getConnection 的方法?
猜你喜欢
  • 2017-05-26
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
相关资源
最近更新 更多