使用promise等待数据库操作
Use promise to wait for database operation
我有一个调用另一个函数的函数,该函数连接到数据库以获取一些值。在执行完成之前,我无法继续,因为该值将用于数据库上的另一个事务。
我正在使用 yield
来确定该方法的完成,并使用 promise
来解决或拒绝响应。我是这样做的:
co(function*() {
rec.x = yield getX(a, b);
//use rec to update something else
conn.update(rec);
}).catch((err) => {
console.error(err.stack)
});
function getX(a, b) {
return conn.getVal(a, b);
}
exports.getVal = function(a, b) {
return sql.connect(connStr).then(function() {
return new sql.Request()
.input('a', sql.VarChar(100), a)
.input('b', sql.VarChar(50), b)
.execute('someProc').then(function(recordSet) {
return Promise.resolve(recordSet[0][0]);
});
});
};
我收到此错误:
ConnectionError: Connection is closed.
at node_modules/mssql/lib/main.js:1613:17
at doNTCallback0 (node.js:417:9)
at process._tickCallback (node.js:346:13)
编辑
连接字符串:
Uname:pass@server/database
在花了几个小时弄清楚 mssql
的巫术之后。似乎 mssql
不能很好地处理并发 connection
。因此,在发出连接请求时使用 setTimeout
解决了我的问题。
如果它对任何人有帮助,这就是我所做的:
exports.getVal = function(obj, cb) {
var connection = new sql.Connection(config, function(err){
if (err){
console.log(err);
}
console.log('connected..');
var request = new sql.Request(connection);
request.input('a', sql.VarChar(100), obj.a);
request.input('b', sql.VarChar(50), obj.b);
request.execute('proc', function (err, recordSet, returnValue, affected) {
if (err) {
console.log(err);
}
cb(recordSet[0][0]);
});
});
};
我是这样称呼的:
setTimeout(function(){
getVal(rec, function(obj){
console.log(obj);
});
}, 500);
我有一个调用另一个函数的函数,该函数连接到数据库以获取一些值。在执行完成之前,我无法继续,因为该值将用于数据库上的另一个事务。
我正在使用 yield
来确定该方法的完成,并使用 promise
来解决或拒绝响应。我是这样做的:
co(function*() {
rec.x = yield getX(a, b);
//use rec to update something else
conn.update(rec);
}).catch((err) => {
console.error(err.stack)
});
function getX(a, b) {
return conn.getVal(a, b);
}
exports.getVal = function(a, b) {
return sql.connect(connStr).then(function() {
return new sql.Request()
.input('a', sql.VarChar(100), a)
.input('b', sql.VarChar(50), b)
.execute('someProc').then(function(recordSet) {
return Promise.resolve(recordSet[0][0]);
});
});
};
我收到此错误:
ConnectionError: Connection is closed.
at node_modules/mssql/lib/main.js:1613:17
at doNTCallback0 (node.js:417:9)
at process._tickCallback (node.js:346:13)
编辑
连接字符串:
Uname:pass@server/database
在花了几个小时弄清楚 mssql
的巫术之后。似乎 mssql
不能很好地处理并发 connection
。因此,在发出连接请求时使用 setTimeout
解决了我的问题。
如果它对任何人有帮助,这就是我所做的:
exports.getVal = function(obj, cb) {
var connection = new sql.Connection(config, function(err){
if (err){
console.log(err);
}
console.log('connected..');
var request = new sql.Request(connection);
request.input('a', sql.VarChar(100), obj.a);
request.input('b', sql.VarChar(50), obj.b);
request.execute('proc', function (err, recordSet, returnValue, affected) {
if (err) {
console.log(err);
}
cb(recordSet[0][0]);
});
});
};
我是这样称呼的:
setTimeout(function(){
getVal(rec, function(obj){
console.log(obj);
});
}, 500);