Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用承诺等待数据库操作_Javascript_Node.js_Promise_Generator_Co - Fatal编程技术网

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)
,会发生什么情况?你也会犯同样的错误吗?