【问题标题】:I want to return the result when all the queries in the loop is done(express.js, react.js, mysql)我想在循环中的所有查询完成后返回结果(express.js、react.js、mysql)
【发布时间】:2020-10-08 20:33:17
【问题描述】:

我正在使用 react 和 express 进行一个辅助项目。

我想在列表中发送我的数据库中特定项目的 7 天的丢弃数据以供搜索。

所以我写了这样的代码。

使用 date(droped_at) = date(date_add(now(),interval -*${i}* DAY) 和 for 循环。

for (var i = 1; i < 8; i++) {
    var resultSql1 = `SELECT T.channel_name, T.channel_number, T.VALUE, T.num from(SELECT itemId, channel_name, channel_number, COUNT(*) AS VALUE, ROW_NUMBER() over(order by value DESC) NUM FROM item_drop_exception WHERE  itemId = (SELECT itemId FROM item_exception WHERE itemid = '${id}') AND date(droped_at) = date(date_add(now(),interval -${i} DAY)) GROUP BY channel_name, channel_number) T WHERE T.NUM<=3 ORDER BY T.num ORDER BY T.NUM`
    db.query(resultSql1, id, (err, data) => {
        if (!err) {
            list1.push(data);
            if (list1.length == 7) {
                res.send(list1);
            }
        }
        else {
            res.send(err);
        }
    })
}

但它不起作用。

我知道方法不对。

我认为在查询结果进来之前下一个循环正在进行,但我不知道该怎么做。

这样引入 7 天的数据是否正确?

我想在所有结果都追加完成后将数据发送到前面。

这并不容易,因为我是自学成才的,我需要帮助。

【问题讨论】:

    标签: javascript mysql node.js reactjs express


    【解决方案1】:

    把你的函数调用变成一个promise,然后在每个循环中await它,确保每个数据库查询一个接一个地运行。

    const { promisify } = require('util');
    const dbQueryAsync = promisify(db.query);
    
    async function getData(req, res) {
        var { id } = req.params;
        var list = [];
        for (var i = 1; i < 8; i++) {
            var resultSql1 = `SELECT ... `;
            try {
                var data = await dbQueryAsync(resultSql1, id);
                list.push(data);
            } catch(err) {
                res.send(err);
            }
        }
        res.send(list);
    );
    

    【讨论】:

    • 谢谢你,我现在知道如何使用和举例promise了!!上面的代码在修复查询后运行良好,但我认为是错误的实现方式,所以我会尝试按照你告诉我的方式更正它!
    【解决方案2】:

    查询有一个小错误。

    最后你有一个双 ORDER BY t.NUM,所以当你删除它时,查询就会运行。但是,如果它为您提供正确的结果,则只能回答,因为我们有数据

    所以

    var resultSql1 = `SELECT T.channel_name, T.channel_number, T.VALUE, T.num from(SELECT itemId, channel_name, channel_number, COUNT(*) AS VALUE, ROW_NUMBER() over(order by value DESC) NUM FROM item_drop_exception WHERE  itemId = (SELECT itemId FROM item_exception WHERE itemid = '${id}') AND date(droped_at) = date(date_add(now(),interval -${i} DAY)) GROUP BY channel_name, channel_number) T WHERE T.NUM<=3 ORDER BY T.num`
    

    每天都会给你一个结果

    【讨论】:

    • 哇...我真的没想到。谢谢你。我已经修改了它,它工作正常。
    猜你喜欢
    • 2014-04-24
    • 2017-10-07
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多