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副本