У меня два запроса.
Первый,
SELECT auctions.name, wowitemdata.itemName, auctions.itemId,
auctions.buyout, auctions.quantity
FROM auctions
INNER JOIN wowitemdata ON auctions.itemId = wowitemdata.itemID;
возвращает такие данные:
{
name: 'somename',
itemName: 'someitemname',
itemId: '0000',
buyout: '0001',
quantity: '5',
}
Второй запрос использует данные из #1, чтобы получить count() товаров дешевле, чем itemId. Ответ должен быть добавлен к #1 как новый элемент -> 'подрезание'.
Моя функция:
function checkUndercut(data, length){
var Select = 'SELECT COUNT(auctions.itemId) AS cnt ';
var From = 'From `auctions` ';
var Where = 'WHERE auctions.itemId LIKE ? AND buyout < ?';
var sql = Select + From + Where;
for(i = 0, len = length; i < len; i++){
var inserts = [data[i]['itemId'], data[i]['buyout']];
var ssql = mysql.format(sql, inserts);
data[i]['undercut'] = i;
connection.query(ssql, function(err, rows, fields){
if(!err){
console.log("check Undercut: " + rows[0].cnt);
data[i]['undercut'] = rows[0].cnt;
} else {
console.log("Error while performing Query");
};
});
};
}
Из-за асинхронного характера запроса я не могу использовать переменную цикла for для добавления данных.
Как это обойти?
Редактировать: Моя новая проблема:
Когда я ищу имя (searchobj), возвращаемые данные отстают на один шаг.
Допустим, я ищу Тима, но ничего не появляется.< br /> Скажем, я ищу Финна, появляются мои данные о Тиме.
Я подозреваю, что это из-за того, как я получил данные из моей функции checkUndercut.
Я создал новую переменную верхнего уровня, appdata и после использования предложения @simple_programmers я поместил свой новый код следующим образом:
function(err){
if(err){
//handle the error if the query throws an error
}else{
appdata = data;
console.log(appdata);
//whatever you wanna do after all the iterations are done
}
});
console.log отправляет правильную информацию, поэтому моя проблема связана с преждевременной отправкой ответа функцией get.
Моя функция получения:
app.get('/test',function(req, res) {
console.log("app.get "+searchobj);
var sqlSELECT = 'SELECT auctions.name, wowitemdata.itemName, auctions.itemId, auctions.buyout, auctions.quantity ';
var sqlFROM = 'FROM `auctions` ';
var sqlINNER ='INNER JOIN `wowitemdata` ON auctions.itemId = wowitemdata.itemID ';
var sqlWHERE = 'WHERE auctions.name LIKE ?';
var sql = sqlSELECT + sqlFROM + sqlINNER + sqlWHERE;
var inserts = [searchobj];
var sql = mysql.format(sql, inserts);
//console.log("Query: "+sql);
connection.query(sql, function(err, rows, fields) {
if (!err){
var rowLen = rows.length;
checkUndercut(rows, rowLen);
console.log(appdata);
res.send(appdata);
} else {
console.log('Error while performing Query.');
};
});
});
Мои вопросы:
1 Каков правильный способ отправки данных из асинхронной функции?
2 Есть ли способ заставить мой app.get или res.send ждать, пока мои данные не будут получены, прежде чем отправлять их?
Редактировать 2: я могу заставить его работать, поместив весь код в мой app.get(), но должно быть более элегантное и легко читаемое решение?
auctions
ВНУТРЕННЕГО СОЕДИНЕНИЯwowitemdata
НА аукционах.itemId = wowitemdata.itemID». Редактировать: проклятое форматирование - person user45706   schedule 13.10.2016