javascript承诺共享连接和执行查询
我想知道这种方法是否正确,或者是否需要进一步的改进,也许还可以推荐定制的mySQLjavascript承诺共享连接和执行查询,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我想知道这种方法是否正确,或者是否需要进一步的改进,也许还可以推荐定制的mySQLgetConnection方法 request: function(queryRequest) { return new Promise(function(resolve, reject){ Database.getConnection(function(error, connection){ if(error) {
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);
});
},
也许还可以推荐自定义mySQLgetConnection
方法
也许吧。虽然可以认为它更干净,使回调金字塔更平坦,但它并没有对代码进行太多改进:
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};
});
}
我想知道这种方法是否正确
对于数据库连接,您可能需要查看。如果你不需要它,你仍然应该记得总是释放你的连接,使用类似
….then(function (connection) {
var res = …;
// better be solved using `finally` where supported
return res.then(end, end);
function end() {
connection.release();
return res;
}
})
另外,拒绝带有无Error
s对象的承诺是一种不好的做法,您最好这样做
….catch(function(error) {
error.queryRequest = queryRequest;
throw error;
})
或者在您的原始模式中的等效项。啊,在我发表评论之前,您已经修复了
拒绝(错误,queryRequest)
。-)我建议使用连接池或promise库的内置功能(在bluebird中使用)提供了节点mysql
的预期版本。也就是说,这是基于意见的,所以我投票决定结束,欢迎您在javascript聊天室或IRC上的#promises上讨论这个问题。您使用的promise库是什么?第二个库中有一些分号重复,请查看。我读到了有关disposer模式的内容,我们可以在第二个解决方案中使用connection.release()
+1对于错误。queryRequest
建议“分号重复”是什么意思?没有语法错误。很抱歉,它是正确的。您是否建议使用connection.release
根据处理器模式在第二次解析下进行释放?是的,您可能应该在此请求
方法中包括connection.release
。可能是在一个额外的then
处理程序中,尤其是当它可以抛出时。如果每次都使用连接执行不同的操作,那么disposer模式尤其有用。connection.query
是您唯一使用的方法,还是您还有其他方法可以调用Database.getConnection
?