我如何才能为nodejs正确地承诺这两种数据库方法
How can I properly promisify these two database methods for nodejs?
我有一个处理连接设置和池的数据库模块,还有一个依赖数据库模块执行查询的查询模块。我正在对它们进行调整,以便将Promises用于异步调用。到目前为止,我已经调整了查询模块——现在我希望转换数据库模块。
问题是:查询模块(目前依赖于回调)应该可以直接使用数据库模块,也可以隐式使用数据库模块。我如何在两个模块的方法中使用promise,而不把它变成一个由曲折的小段落组成的迷宫?
以下是我迄今为止所做的:
数据库模块
getConnection: function(callback) { //this should return a promise
this.pool.getConnection(function(error, connection){
callback(error, connection);
});
},
查询模块这应该是getConnection
上的then
承诺,执行查询,然后拒绝/解决其调用方
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});
}
connection.release()
});
}
});
});
},
getConnection
应返回[连接]的承诺
相反,它应该使用处理器模式,并调用connection.release()
本身:
function withConnection(callback) {
var pool = this.pool;
var conn = new Promise(function(resolve, reject) {
pool.getConnection(function(error, connection){
if (error)
reject(error);
else
resolve(connection);
});
});
return conn.then(function(connection) {
var res = conn.then(callback); // safe call
return res.then(fin); // `finally` shim
function fin() {
connection.release();
return res;
}
});
}
function request(queryRequest) {
return Database.withConnection(function(connection) {
return 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});
});
});
}).catch(function(error) {
error.queryRequest = queryRequest;
throw error;
});
}
数据库模块
getConnection: function() {
return new Promise(function(resolve, reject) {
this.pool.getConnection(function(error, connection){
if(error) {
reject(error);
} else {
resolve(connection);
}
});
});
},
查询模块
execute: function(queryRequest) {
var self = this;
this.queryRequest = queryRequest;
return new Promise(function(resolve, reject) {
self.resolve = resolve;
self.reject = reject;
var promise = Database.getConnection();
promise.then(self.result.bind(self), self.fault.bind(self));
});
},
result: function(connection) {
var self = this;
connection.query(this.queryRequest.sql, this.queryRequest.values, function(error, rows, fields) {
if (error) {
self.reject(error);
} else {
self.resolve({rows: rows, fields: fields, queryRequest: self.queryRequest});
}
connection.release();
});
},
fault: function(info) {
self.reject(info);
}
相关文章:
- 使用javascript单击同一按钮,在两种样式之间更改css值
- 把两种不同的形式合为一
- 这两种不同的创建对象文字的方法有什么区别
- angularjs两种功能的替代品(欧芹和重置)
- 我想要相同的函数以两种方式反应
- HTML中两种JS实现之间的差异
- 比较两种不同格式的时间戳-GAS
- 这两种方法有什么不同
- 正则表达式,两种方式,不同的结果
- 如何将两种不同类型的事件附加到同一元素
- 这两种使用 jQuery 追加 DOM 元素的方法有什么不同
- 通过两种方法创建和更新 CSS
- 什么'这两种继承策略之间的区别是什么
- 使用jQuery过滤两种输入类型
- 如何在面板中添加在两种类型的谷歌图表之间切换的按钮
- 选择两种颜色并在两者之间选择n种颜色
- 在承诺链中调用两种方法
- 承诺的两种实现之间的差异
- 两种承诺链实现方式的区别
- 我如何才能为nodejs正确地承诺这两种数据库方法