我有以下代码:
app.get('/showtable1', (req, res) => {
console.log("yo ho");
mysqlconnection.query('SELECT d_name FROM datacenters', (err, rows, fields) => {
if (!err) {
var array = [];
var tier = ['Class 0','Class 1','Class 2','Class 3'];
var str = '';
Object.keys(rows).forEach(function(key) {
var row = rows[key];
array.push(row.d_name);
});
for( var i = 0 ; i<array.length ; i++) {
str += '<tr><td>'+array[i]+'</td>';
console.log('sfsf');
for (var j=0 ; j< tier.length ; j++) {
let query1 = "SELECT * FROM `datacenters` WHERE d_name = '"+array[i]+"' AND d_tiers LIKE '%"+tier[j]+"%'"
mysqlconnection.query(query1,(err,rows) => {
if(!err) {
if(rows.length !=0) {
console.log(1);
} else {
console.log(0);
}
}
});
}
}
res.send(rows);
}
else
console.log(err);
})
});
这段代码的输出是:
yo ho
sfsf
sfsf
sfsf
1
1
0
0
1
1
1
0
1
1
1
0
但我需要输出为:
yo ho
sfsf
1
1
0
0
sfsf
1
1
1
0
sfsf
1
1
1
0
第一个输出来了,因为代码是异步运行的;但我需要同步运行它。我怎样才能做到这一点?
异步任务没有顺序。您可以使用Promise
和async/await
来获得有序的输出。
您可以承诺您的查询,例如:
function getNames() {
return new Promise((resolve, reject) => {
mysqlconnection.query('SELECT d_name FROM datacenters', (err, rows, fields) => {
if (!err) {
reject(err);
} else {
resolve(rows)
}
})
});
}
function getDatacenters(firstVal, tier) {
const query1 = "SELECT * FROM `datacenters` WHERE d_name = '"+firstVal+"' AND d_tiers LIKE '%"+tier+"%'";
return new Promise((resolve, reject) => {
mysqlconnection.query(query1,(err,rows) => {
if(!err) {
reject(err)
} else {
resolve(rows)
}
});
})
}
然后在你的路线
app.get('/showtable1', async (req, res) => {
console.log("yo ho");
const namesArray = [];
const names = await getNames();
Object.keys(names).forEach(function(key) {
var row = names[key];
namesArray.push(row.d_name);
});
const namesVal = [];
for (let i = 0; i < namesArray.length; i++) {
for (let j = 0; j < tier.length; j++) {
namesVal.push(getDatacenters(entry, tier));
}
}
// ordered array or result
const result = await Promise.all(namesVal)
...
// rest of the code
})
注意:我不知道您使用的是哪个库。一些库提供Promise
支持,因此您不必编写自己的包装器
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句