Javascript 使用承诺等待数据库操作
我有一个函数调用另一个函数,该函数连接到数据库以获取一些值。在执行完成之前,我无法继续,因为该值将用于数据库上的另一个事务 我使用Javascript 使用承诺等待数据库操作,javascript,node.js,promise,generator,co,Javascript,Node.js,Promise,Generator,Co,我有一个函数调用另一个函数,该函数连接到数据库以获取一些值。在执行完成之前,我无法继续,因为该值将用于数据库上的另一个事务 我使用yield确定该方法的完成情况,并使用promise解决或拒绝响应。我就是这样做的: co(function*() { rec.x = yield getX(a, b); //use rec to update something else conn.update(rec); }).catch((err) => { console.error(e
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的vodoo之后。似乎
mssql
不能很好地处理并发连接。因此,在发出连接请求时使用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);
在节点_modules/mssql/lib/main.js:1613:17,在您发布的代码中,哪一行是1613,在不经过生成器/成品的情况下完成请求工作?也就是说,如果你直接调用getVal
函数,它能工作吗?你能在帖子中分享你的连接字符串吗?@Freyday是的。请求工作正常,但不产生任何结果。如果将sql.connect(conStr)
分配给connection
变量,然后将connection
传递到sql.request()
中,如sql.request(connection)
,会发生什么情况?你也会犯同样的错误吗?