繁体   English   中英

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

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

我正在尝试运行查询以从表中获取一些数据,然后使用该数据数组从另一个表中获取一些数据,然后将其作为 JSON 返回。

我已经尝试了一段时间,但我似乎无法弄清楚异步和等待。 现在它做了某种工作,但在返回数据之前不会等待我在 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'];
            });
        }
    }
});

我假设必须在 getData async function 中做一些事情,但是我不太确定如何实现一个可行的解决方案。 我已经尝试过承诺,但它们似乎没有按我预期的方式工作。

任何指导将不胜感激。

解决方案

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);
        })

    }
});

异步 function 实际上并未包装

暂无
暂无

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

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