使用诺言等待数据库操作

我有一个函数调用另一个函数,它连接到数据库来获得一些价值。 在执行完成之前,我不能继续进行,因为该值将用于数据库上的另一个事务。

我正在使用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) 

编辑

连接string:

 Uname:pass@server/database 

花了几个小时找出这个mssql vodoo。 好像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);