0

Хочу чтобы результатом выполнения функции был массив массивов с объектами, которые получены из БД.

function cat () {
    var keyboard = []
    var res = []
    db.each('SELECT id, Name FROM Categories', (err, row) => {
        var obj = {}
        obj.text = row.Name
        obj.callback_data = row.id
        res.push(obj)
        keyboard.push(res)
        res = []
    })
    return keyboard
}

Но db.each работает асинхронно и результат выполнения функции пустой массив. Как подождать выполнение запроса? То, что ожидаю от выполнения функции:

[
  [ { text: 'Кот 1', callback_data: 'cat_1' } ],
  [ { text: 'Кот 2', callback_data: 'cat_2' } ]
]

2 Answers2

1

Вы должны сделать свою функцию асинхроной и работать с ней как с асинхронной функцией:

async function cat() {
    return new Promise((resolve, reject) => {
        db.all('SELECT id, Name FROM Categories', [], (err, rows) => {
            if (err) {
                return reject(err);
            }
        const arr = rows.reduce((acc, row) => {
            acc.push({
                text: row.Name,
                callback_data: row.id
            });
            return acc;
        }, []);

        resolve(arr);
    });
});

}

Использование, вариант 1:

cat()
  .then((objects) => console.log(objects))
  .catch((err) => console.error(err));

Использование, вариант 2:

(async () {

try { const objects = await cat(); console.log(objects); } catch (err) { console.error(err); }

})();

nörbörnën
  • 12,192
  • 5
  • 29
  • 40
0

Используйте better-sqlite3. Он в десятки раз быстрее и там нет проблем с асинхронностью.

DiD
  • 7,606
  • Хотя по ссылке можно найти ответ на вопрос, лучше указать здесь самое главное, а ссылку приводить в качестве источника. Если страница, на которую ведет ссылка, будет изменена, ответ-ссылка может стать недействительным. — из очереди проверок – Михаил Ребров Nov 30 '20 at 02:00
  • А что самое главное? Разобравшись изначально в инструментарии, у человека не было бы проблемы, с которой он столкнулся. Человек использует медленный не оптимизированный код с псевдо-асинхронностью вместо нормального легковесного доступа напрямую к библиотеке без лишних С++-абстракций. Чем платится отсутствием толковой документации, неудобным API и скоростью работы приложения. – DiD Nov 30 '20 at 02:36
  • зачем Вы мне это написали? Я не спорю, что предоставленная Вами информация может быть кому-то полезна. Я просто сомневаюсь, что данное сообщение может потянуть на полноценный, однозначный и объективный ответ. Это может быть неплохим советом. Но советы лучше оставлять в комментариях. – Михаил Ребров Nov 30 '20 at 02:45
  • сообщение которое вы Выше пытались оспорить оставлено не мной лично, а роботом из очереди проверок. Учитывайте это в следующий раз, когда будете отвечать на подобные комментарии. – Михаил Ребров Nov 30 '20 at 02:49