【问题标题】:Wait for mysql to finish queries in a for loop before finishing a function in nodeJS在完成nodeJS中的函数之前等待mysql在for循环中完成查询
【发布时间】:2021-11-25 12:34:27
【问题描述】:

我正在尝试运行查询以从表中获取一些数据,然后使用该数据数组从另一个表中获取一些数据,然后将其作为 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 异步函数中完成某些操作,但是我不太确定如何实现有效的解决方案。我尝试过承诺,但它们似乎没有按我预期的方式工作。

任何指导将不胜感激。

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    第一个解决方案:

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

    });

    第二种解决方案:

    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)
            }).catch(error => throw error);
        });
    
        async function getData(tickers) {
            let returnData = {};
            for (let i = 0; i < tickers.length; i++) {
                returnData[tickers[i]['Ticker']] = await getTickerQuery([tickers[i]['Ticker']]);
            }
            return returnData;
        }
        
        function getTickerQuery(ticker) {
            return new Promise((resolve, reject) => {
                cryptoDB.query('SELECT HistoricalJSON FROM historical_trend_data WHERE Ticker=? LIMIT 1', ticker, (err, rows2) => {
                    if (err) throw reject(err);
                    resolve(rows2[0]['HistoricalJSON']);
                });
            })
        }
    });
    

    为了可读性,我推荐第二种解决方案

    【讨论】:

    • 这将在任何查询完成之前解决承诺。
    • 天哪,我忘了那个等待
    • 我修复了解决方案并添加了第二个解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2021-02-15
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多