简体   繁体   English

等待 mysql 在 for 循环中完成查询,然后在 nodeJS 中完成 function

[英]Wait for mysql to finish queries in a for loop before finishing a function in nodeJS

I am trying to run a query to get some data from a table, then use that array of data to get some data from another table to then return it as JSON.我正在尝试运行查询以从表中获取一些数据,然后使用该数据数组从另一个表中获取一些数据,然后将其作为 JSON 返回。

I have been trying for a while but I cannot seem to figure out async and await.我已经尝试了一段时间,但我似乎无法弄清楚异步和等待。 Right now it does sort of work but doesn't wait for my second query in the for loop to finish before returning data.现在它做了某种工作,但在返回数据之前不会等待我在 for 循环中的第二个查询完成。

app.get("/get-top-trending", (request, response) => {
    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) => {
        if (err) throw err;

        getData(tickers).then(function() {
            response.send(returnData)
        });
    });

    async function getData(tickers) {
        for (let i = 0; i < tickers.length; i++) {
            cryptoDB.query('SELECT HistoricalJSON FROM historical_trend_data WHERE Ticker=? LIMIT 1', [tickers[i]['Ticker']], (err, rows2) => {
                if (err) throw err;
                returnData[tickers[i]['Ticker']] = rows2[0]['HistoricalJSON'];
            });
        }
    }
});

I assume that something has to be done in the getData async function, however I am not particularly sure how to implement a working solution.我假设必须在 getData async function 中做一些事情,但是我不太确定如何实现一个可行的解决方案。 I have tried promises but they don't seem to work the way that I expect.我已经尝试过承诺,但它们似乎没有按我预期的方式工作。

Any guidance would be appreciated.任何指导将不胜感激。

solution解决方案

app.get("/get-top-trending", (request, response) => {
    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) => {
        if (err) throw err;

        getData(tickers).then(function (returnData) {
            response.send(returnData)
        });
    });

    function getData(tickers) {
        const returnData = {};
        return new Promise((resolve, reject) => {
            for (let i = 0; i < tickers.length; i++) {
                cryptoDB.query('SELECT HistoricalJSON FROM historical_trend_data WHERE Ticker=? LIMIT 1', [tickers[i]['Ticker']], (err, rows2) => {
                    if (err) reject(err);
                    returnData[tickers[i]['Ticker']] = rows2[0]['HistoricalJSON'];
                });
            }
            resolve(returnData);
        })

    }
});

async function is not actually wrapping异步 function 实际上并未包装

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM