我想在Node.js中运行同步查询,就像这样...
for (var i in data){
conn.query("Select 1 from user where userid="+data[i].id,function(err,row){
Rows.push(row);
});
}
console.log(Rows);
在这个代码块中,我的行总是变成 null… 我想运行同步查询。
我想在Node.js中运行同步查询,就像这样...
for (var i in data){
conn.query("Select 1 from user where userid="+data[i].id,function(err,row){
Rows.push(row);
});
}
console.log(Rows);
例如- 您将能够使用以下代码:
for (var i in data) {
let row = await conn.query("Select 1 from user where
userid="+data[i].id);
Rows.push(row);
}
console.log(Rows);
但如果可以并行运行,那么像这样的代码会更有效率,也更短:
let Rows = await Promise.all(data.map(item =>
conn.query("Select 1 from user where userid=" + item.id));
console.log(Rows);
相关详细信息请参阅以下内容:
请注意 - 它只能在使用async
关键字声明的函数内部使用。
警告:您的代码可能会受到SQL注入攻击的影响。您应该在SQL中使用占位符而不是字符串拼接。我没有修复你代码方面的问题 - 有关更多详细信息,请参见这些答案:
您可以创建一个返回 Promise 的包装器。使用 await
您可以使其同步:
function promiseWrapper() {
return new Promise((resolve, reject) => {
conn.query("SQL_QUERY", queryCallback(resolve, reject);
}
}
function queryCallback(err, row){
return (resolve, reject) {
resolve(row);
}
}
你应该使用 bluebird
npm
模块来解决这个问题。使用 npm install bluebird
命令来安装 bluebird
模块。
var Promise = require('bluebird');
var Rows= [];
data.forEach(function (obj) {
conn.query("Select 1 from user where userid="+obj.id,function(err,row){
Rows.push(row);
});
});
return Promise.all(Rows);
})
你也可以使用async模块。
var async= require('async')
async.eachSeries(arr, function(index, callback){
conn.query("Select 1 from user where userid="+index,
function(err,res) {
if (err) {
return console.error('error running query', err);
}else{
Row.push(res);
}
callback();
});
},function(err){
if(err)
return err;
console.log("all queries executed")
});
Promise.all(Rows)
,它会在每次迭代时运行一次,并忽略其返回值。此外,你正在对一个不包含promise的数组运行Promise.all
。它到底应该做什么呢? - rsp