Async и ожидание вызова MySQL в узле js

все Я новичок в node, и я только что узнал о функциях async и await, предлагаемых в javascript. Я пытаюсь реализовать этот метод в прилагаемом ниже фрагменте кода. Насколько я понимаю, ответ базы данных должен сначала выводиться на консоль, а затем «готово», но я не могу заставить его работать. Любая помощь будет принята с благодарностью.

Пожалуйста, также попытайтесь объяснить, что вы сделали, чтобы исправить это, потому что я хочу понять, что я делаю не так.

var mysql = require("mysql");
const cTable = require('console.table');

var connection = mysql.createConnection({
    host: "localhost",
    port: 8889,
    user: "root",
    password: "root",
    database: "testDB"
})

connection.connect((err, fields) => {
    if (err) {
        return console.info(err.code);
    }
});

var displayDB = async () => {
    connection.query('SELECT * FROM products', (err, resp) => {
        if (err) {
            return console.info(err.code);
        } else {
            table = [];
            resp.forEach((product) => {
                obj = {
                    'Product ID': product.productID,
                    'Category': product.category,
                    'Price': product.price,
                    'Stock': product.stockQuantity
                }
                table.push(obj)
            })
            console.table(table)
            connection.end()
        }
    })
}

var test = async () => {
    var x = await displayDB()
    console.info('done')
}
test()

Это не сработает, если connection.query не вернет обещание. Я давно не смотрел, но не думаю, что модуль узла MySQL делает это. Таким образом, вам нужно будет обернуть это обещанием и вернуть обещание из функции.

Mark 23.07.2018 09:32

@MarkMeyer - это не сработает, даже если connection.query действительно вернет обещание, поскольку возвращаемое значение connection.query игнорируется внутри displayDB.

Quentin 23.07.2018 09:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
3 359
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас нет оператора return в вашей функции displayDB.

Обычно это приводит к тому, что функция возвращает undefined, но, поскольку вы объявили ее как async, она заставляет возвращать Promise с разрешенным немедленно.

Если вы хотите, чтобы он дождался завершения запроса к базе данных, вам нужно, чтобы явно возвратил new Promise, который тыresolve, когда вы будете готовы (то есть после того, как вы позвонили connection.end()).

Вам нужно вернуть обещание из асинхронной функции displayDB, если вы хотите использовать ключевое слово await в тесте, вам нужно сначала узнать, как работают обещания. Псевдокод:

var displayDB = () => {
    return new Promise((resolve,reject)=>{
        connection.query('SELECT * FROM products', (err, resp) => {
            if (err) {
                reject(err)
            } else {
                const table = [];
                resp.forEach((product) => {
                    obj = {
                    'Product ID': product.productID,
                    'Category': product.category,
                    'Price': product.price,
                    'Stock': product.stockQuantity
                    }
                    table.push(obj)
                })
                resolve(table)
            }
        })
    })
}


var test = async () => {
   try{
    console.table(await displayDB())
    }catch(e){
        console.info(e)
    }
    connection.end()
}
test()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

You need to return a promise from an async function не совсем. async function здесь ничего не делает, это может быть обычная функция. Вам не нужно возвращать обещание из асинхронной функции, поскольку она делает это сама.
Jonas Wilms 23.07.2018 09:39

чтобы использовать ключевое слово await, вам нужно разрешить обещание в этом примере. Все дело в контексте. Обещание возвращает результат здесь, таблица.

mpm 23.07.2018 09:40

Другие вопросы по теме