Показать сообщение отдельно
  #4 (permalink)  
Старый 15.10.2020, 09:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Сообщение от 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 - проще и понятнее.

Последний раз редактировалось voraa, 15.10.2020 в 09:24.
Ответить с цитированием