Подождите, пока mysql завершит запросы в цикле for, прежде чем завершать функцию в NodeJS

#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. Я исправил решение и добавил второе решение