#javascript #mysql #node.js
Вопрос:
Я пытаюсь выполнить запрос, чтобы получить некоторые данные из таблицы, а затем использовать этот массив данных для получения некоторых данных из другой таблицы, чтобы затем вернуть их в формате JSON.
Я уже некоторое время пытаюсь, но, похоже, не могу понять, что такое асинхронность и ожидание. Прямо сейчас он выполняет некоторую работу, но не ждет завершения моего второго запроса в цикле for, прежде чем возвращать данные.
app.get("/get-top-trending", (request, response) =gt; { const req = request.query let query = 'SELECT Ticker, Mentions FROM trend_data ORDER BY Date DESC, ' req.by ' DESC LIMIT 3'; let returnData = {}; cryptoDB.query(query, (err, tickers) =gt; { if (err) throw err; getData(tickers).then(function() { response.send(returnData) }); }); async function getData(tickers) { for (let i = 0; i lt; tickers.length; i ) { cryptoDB.query('SELECT HistoricalJSON FROM historical_trend_data WHERE Ticker=? LIMIT 1', [tickers[i]['Ticker']], (err, rows2) =gt; { if (err) throw err; returnData[tickers[i]['Ticker']] = rows2[0]['HistoricalJSON']; }); } } });
Я предполагаю, что что-то должно быть сделано в асинхронной функции getData, однако я не совсем уверен, как реализовать рабочее решение. Я пробовал обещания, но они, похоже, работают не так, как я ожидаю.
Буду признателен за любые рекомендации.
Ответ №1:
первое решение:
app.get("/get-top-trending", (request, response) =gt; { const req = request.query let query = 'SELECT Ticker, Mentions FROM trend_data ORDER BY Date DESC, ' req.by ' DESC LIMIT 3'; cryptoDB.query(query, (err, tickers) =gt; { if (err) throw err; getData(tickers).then(function (returnData) { response.send(returnData) }); }); async function getData(tickers) { const returnData = {}; const querys = ((ticker) =gt; { return new Promise((resolve, reject) =gt; { cryptoDB.query('SELECT HistoricalJSON FROM historical_trend_data WHERE Ticker=? LIMIT 1', [ticker['Ticker']], (err, rows2) =gt; { if (err) reject(err); returnData[ticker['Ticker']] = rows2[0]['HistoricalJSON']; resolve(); }); }) }) for (let i = 0; i lt; tickers.length; i ) { await querys(tickers[i]); } return returnData }
});
второе решение:
app.get("/get-top-trending", (request, response) =gt; { const req = request.query let query = 'SELECT Ticker, Mentions FROM trend_data ORDER BY Date DESC, ' req.by ' DESC LIMIT 3'; cryptoDB.query(query, (err, tickers) =gt; { if (err) throw err; getData(tickers).then(function(returnData) { response.send(returnData) }).catch(error =gt; throw error); }); async function getData(tickers) { let returnData = {}; for (let i = 0; i lt; tickers.length; i ) { returnData[tickers[i]['Ticker']] = await getTickerQuery([tickers[i]['Ticker']]); } return returnData; } function getTickerQuery(ticker) { return new Promise((resolve, reject) =gt; { cryptoDB.query('SELECT HistoricalJSON FROM historical_trend_data WHERE Ticker=? LIMIT 1', ticker, (err, rows2) =gt; { if (err) throw reject(err); resolve(rows2[0]['HistoricalJSON']); }); }) } });
Я рекомендую второе решение для удобства чтения
Комментарии:
1. Это позволит выполнить обещание до того, как будут выполнены какие-либо запросы.
2. боже, я забыл об этом, подожди
3. Я исправил решение и добавил второе решение