Сообщение от riaron
|
Как это решить?
|
Использовать Promise.
Я не большой знаток node, но вроде есть библиотека, для работы с mysql основанная на promise.
Можно и с этой попытаться самому сделать через Promise.
Эти запросы можно изобразить как то так
function pquery (con, sql, par) {
return new Promise ( (res, rej) => {
con.query (sql, par, (err, result) => {
if (err) {
rej (err);
} else {
res (result);
}
})
})
}
var sql3='SELECT `id` FROM `orders`';
var sql2='SELECT `orderid` FROM `orders` GROUP BY `orderid`';
var sql1 ='SELECT `id`,`prod`,`name`,`photo`,`price`,`sale`,`remote_adr`,`quantity` FROM `orders` LIMIT ?,?';
Promise.all([
pquery (connection, sql3, []).then( resulta => {
length=resulta.length;
if(start<0){start=0;}
if(end>(length-req.params.page*10)%10){end=length;}
}),
pquery (connection, sql2, []).then( result => {
orderids=result;
})
]).then ( () => {
return pquery (connection, sql1, [start,end]).then ( results => {
for(var j=0;j<1;j++) {
allprice = 0;
for (var i = 0; i < 1; i++) {
// Create the object to save the data.
b = results[i].price - results[i].price * results[i].sale / 100;
a = b * results[i].quantity;
allprice += a;
var smart = {
'id': results[i].id,
'prod': results[i].prod,
'name': results[i].name,
'photo': results[i].photo,
'sale': results[i].sale,
'price': results[i].price,
'tsale': b,
'vsego': a,
'quantity': results[i].quantity,
'allprice': allprice,
};
smartphone.push(smart);
}
allsmartphone[orderids[j]['orderid']][j] = smartphone;
}
var smartphoneList={
'len':length,
'jlen':end,
'ip':valuesii,
}
console.log(orderids[1]['orderid']+" :smart: "+allsmartphone[orderids[1]['orderid']][0]['id']);
res.render('orders', {"smartphoneList": smartphoneList,"allsmartphone": allsmartphone,'orderids':orderids});
}
);
}).catch (err => {
console.log(err);
})
Запросы sql2 и sql3 могут выполняться параллельно. А запрос sql1 гарантированно только после того, как sql2 и sql3 будут исполнены
Ну или делать вложенные обратные вызовы.
Сначала делать запрос sql3, в его обратном вызове делать запрос sql2, а в его обратном вызове - запрос sql1.
По мне, через Promise - проще и понятнее.