#node.js
#node.js
Вопрос:
У меня есть следующий код:
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
Первый вывод приходит, потому что код выполняется асинхронно; но мне нужно запустить его синхронно. Как я могу это сделать?
Ответ №1:
Асинхронная задача не имеет порядка. Вы можете использовать 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
поддержку, поэтому вам не нужно писать свои собственные обертки
Комментарии:
1. вы сделали свою функцию
async
?