簡體   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