все Я новичок в 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()
@MarkMeyer - это не сработает, даже если connection.query действительно вернет обещание, поскольку возвращаемое значение connection.query игнорируется внутри displayDB.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У вас нет оператора 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 здесь ничего не делает, это может быть обычная функция. Вам не нужно возвращать обещание из асинхронной функции, поскольку она делает это сама.
чтобы использовать ключевое слово await, вам нужно разрешить обещание в этом примере. Все дело в контексте. Обещание возвращает результат здесь, таблица.
Это не сработает, если
connection.queryне вернет обещание. Я давно не смотрел, но не думаю, что модуль узла MySQL делает это. Таким образом, вам нужно будет обернуть это обещанием и вернуть обещание из функции.