const config = require('./config');
const mysql = require('mysql2/promise');
var result ;
async function main() {
const connection = await mysql.createConnection(config);
const qantity= await connection.execute('SELECT count(1) FROM `quotes`');
connection.end()
return qantity[0][0]['count(1)'];
}
main().then((res) =>{
result = res
console.log(res)
//3
});
console.log(result)
//undefined
- Элемент списка
-
Потому что сначала выводится result, затем выполняется запрос к бд, затем выводится res – SwaD Sep 10 '23 at 09:08
-
Обновил свой ответ. В следующий раз пожалуйста, если появились какие-то вопросы, то спрашивайте в комментарии к ответу, а не изменяйте вопрос. – Павел Ериков stand with Russia Sep 10 '23 at 09:34
-
это же асинхронная функция.... а console.log исполняется синхронно. на тот момент в result ещё нет ничего...запрос ещё не успел выполниться........см. ответы дубликаты...исправить - никак - делай так в then или см. вот этот ответ https://ru.stackoverflow.com/a/1476674/191482 – Алексей Шиманский Sep 10 '23 at 09:40
1 Answers
Потому, что сначала вы вызываете функцию main, которая выполняется асинхронно. Т.к. она асинхронная, то javascript идет дальше по коду и выполняет строчку console.log(result), и выводит undefined т.к. вы переменной result ничего не присвоили.
И как только функция main закончила свою работу, вызывается стрелочная функция в then, в которой присваивается значение result, ну и выполняется строчка console.log(result).
Увидел, обновление вопроса...
Можно в then после присвоения result вызывать функцию, которая продолжит выполнение кода. Например:
main().then((res) =>{
result = res;
console.log(res);
someNextFunction();
});
function someNextFunction() {
console.log(result);
}
Или создать еще одну асинхронную функцию, куда поместить вызов main и дождаться его выполнения (await), после чего вызвать console.log. Например:
async function run() {
await main().then((res) => {
result = res;
console.log(res);
});
console.log(result);
}
run();