Я хочу вернуть результат, когда все запросы в l oop будут выполнены (express. js, react. js, mysql) - PullRequest
1 голос
/ 18 июня 2020

Я работаю над побочным проектом, используя реакцию и express.

Я хочу отправить данные о перетаскивании за 7 дней определенного c элемента в моей базе данных в списке для поиска.

Итак, я написал такой код.

Используйте date(droped_at) = date(date_add(now(),interval -*${i}* DAY) и для l oop.

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

Но это не работает.

Я знаю, что это неправильный метод.

Я думаю, что следующий l oop произойдет до того, как появятся результаты запроса, но я не знаю, что делать.

Правильно ли вводить данные за семь дней вот так?

Я хочу отправить данные на передний план, когда все результаты будут добавлены и завершены.

Это непросто, потому что я самоучка, мне нужна помощь.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Превратите вызов вашей функции в обещание, а затем await внутри каждого l oop, чтобы каждый запрос к базе данных выполнялся один за другим.

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);
);
1 голос
/ 18 июня 2020

В запросе есть небольшая ошибка.

У вас есть двойная 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`

Дадут вам результат за каждый день

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...