Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
Mysql 在进行异步调用的For循环之后,Q不会解析_Mysql_Node.js_Asynchronous_Promise_Q - Fatal编程技术网

Mysql 在进行异步调用的For循环之后,Q不会解析

Mysql 在进行异步调用的For循环之后,Q不会解析,mysql,node.js,asynchronous,promise,q,Mysql,Node.js,Asynchronous,Promise,Q,这里很简单,但我似乎遗漏了一些细微差别。我正在创建一个承诺数组,并使用Q.all()确保在将响应发送回客户机之前完成对数据库的所有插入。然而,它从未被调用。如何获得要发送的响应 var promises = []; for(var i=0; i < rows.length; i++){ // Insert new row here var def = Q.defer(); promises.push(def.promise)

这里很简单,但我似乎遗漏了一些细微差别。我正在创建一个承诺数组,并使用
Q.all()
确保在将响应发送回客户机之前完成对数据库的所有插入。然而,它从未被调用。如何获得要发送的响应

    var promises = [];

    for(var i=0; i < rows.length; i++){
        // Insert new row here
        var def = Q.defer();
        promises.push(def.promise);

        var query = connection.query(createQuery(rows[i]), function(err, rows) {
          if(err) {
            console.log(err);
            return;
          }
        });

        query.on('end', function(){
            console.log(def);
            def.resolve();
        });


    }

    Q.all(promises).then(function() {
       res.json({success:true, rows: rows.length});
    });
var承诺=[];
对于(变量i=0;i
您对
def.resolve()
的调用是不可预测的。如果查询需要时间,那么所有查询都将一次又一次地解析最后一个def。您还需要维护一个def数组

var promises = [], defs = [];
现在,找出一种方法,将各个def与正确的查询连接起来,并在解析查询时解析该def

也可以在匿名函数中调用查询函数。在这种情况下,您不需要defs数组

function(def) {
    var query = connection.query(createQuery(rows[i]), function(err, rows) {
        if(err) {
            console.log(err);
            return;
        }
    });

    query.on('end', function(){
        console.log(def);
        def.resolve();
    });
}(def);
或 把那个部分拿出来,把它变成一个函数

function queryRow(row, def) {
    var query = connection.query(createQuery(row), function(err, rows) {
        if(err) {
            console.log(err);
            return;
        }
    }); 

    query.on('end', function(){
        console.log(def);
        def.resolve();
    });
}

queryRow(rows[i], def);
或者,您可以使用q函数并将mysql查询函数转换为返回承诺的函数。

使用
.map()
.nfbind

var queryAsync = Q.nfbind(connection.query, connection);
Q.all(rows.map(function(row)) {
    return queryAsync(createQuery(row));
})).then(function() {
    res.json({success:true, rows: rows.length});
});

我接受了您所说的,然后在for循环之外使用了resolveIndex。然后,在解析每个承诺时,我递增resolveIndex,以便下次解析def时,它将解析def[]数组中的正确索引。听起来还好吗?没有。仅仅递增是不行的,因为查询可能无法按顺序解析。您需要创建另一个函数,该函数反过来返回您的查询函数。你需要通过索引<代码>函数getQueryFunc(行,索引){return function(){//return query function}}。在那里,你可以保持索引,因为关闭。我没有看到这一点很清楚。你介意在你的答案中写一些高级代码吗?我已经写了代码。但我建议您使用q.denodeify或q.nfbind可能的Wait副本,确切的Wait副本